Ссылка рушится?

Пытаясь решитьЭта проблемачто-то заставило меня задуматься. Рассмотрим следующий код:

template <typename T>
struct foo 
{
    foo(T const& x) : data(x) {}
    T data;
};

Кажется, что я могу построить объект типаfoo<T const&> без ошибок, гипотетическийT const& const& быть понятым какT const&.

Кажется также, что это называетсясвертывание ссылок, но я никогда не слышал этот термин раньше (см. комментарии в связанном вопросе).

Это широко распространено? Это стандарт?

 Steve Townsend22 сент. 2010 г., 19:00
+1. У меня есть домашнее задание, спасибо
 Baiyan Huang10 нояб. 2010 г., 13:51
Я хотел бы связать этот похожий вопрос:stackoverflow.com/questions/4144234/...

Ответы на вопрос(2)

этотв C ++ 98 была ограничена поддержка свертывания ссылок:

В C ++ 98 есть только одно правило свертывания ссылок: T & & или ссылка на ссылку сворачивается в T &:

void g(int & ri) {++ri;} // int& & -> int& 
void f(int & ri) {g(ri);}

Даже там нельзя пытаться объявить переменную, которая является ссылкой на ссылку:

int ben;
int& bill(ben);     // OK
int & & bob(bill);  // error C2529: 'bob' : reference to reference is illegal
 Potatoswatter20 июн. 2013 г., 14:29
Ссылка, которую вы удалили, не та, на которую я ссылался в первом комментарии. Пример ошибочен; вызов функцииg( ri ) не предполагает какого-либо разрушения.
 Potatoswatter20 июн. 2013 г., 00:00
Спасибо ... но хм, эта ссылка не та, на которую я перешел раньше.
 Potatoswatter19 июн. 2013 г., 08:25
В C ++ 03 нет свертывания ссылок. Автор этой статьи ошибочен. Тип выражения-идентичности, использующего имя ссылки, не является ссылочным типом.нет выражение имеет ссылочный тип. У выражений есть категории значений, которые определяют, как они могут связываться со ссылками.
 Steve Townsend19 июн. 2013 г., 16:34
@Potatoswatter - спасибо, а также есть лучшие ссылки сейчас. Я удалю эту часть.
 Steve Townsend20 июн. 2013 г., 02:46
@Potatoswatter - я удалил ссылку на MSDN, которая имела ссылки на C ++ 03
Решение Вопроса

В C ++ 03 не разрешалось делать следующее

typedef int &ref;
ref &r = ...; // reference to reference!

Это часто вызывает проблемы у людей, компилирующих с действительно строгими или более старыми компиляторами C ++ 03 (GCC4.1, а также Comeau 8/4/03 не нравится выше), потому что стандартные связыватели объектов функций не заботятся о ссылке ссылаться на «ситуацию», а иногда и создавать такие незаконные типы.

В C ++ 0x это называется "свертыванием ссылок", да. Большинство современных компиляторов C ++ 03 делают это (т.е.T& гдеT обозначает тип ссылкиT снова), задним числом применяя правило.boost.call_traits библиотека позволяет легко объявлять такие параметры функции, так что ситуация «ссылка на ссылку» не возникает.

Обратите внимание, чтоconst Там не имеет никакого эффекта.const Применительно к ссылочному типу молча игнорируется. Таким образом, даже если компилятор поддерживает свертывание ссылок, следующее недопустимо

int const x = 0;

// illegal: trying to bind "int&" to "int const"!
ref const& r = x; 
 Johannes Schaub - litb22 февр. 2011 г., 19:01
@ Фред, это было бы саморекурсивно. Я имею в виду, еслиT являетсяU&и ты говоришьT&тип результатаT - т.е.U&, Конечно, это не совместимо с ссылками rvalue. Я должен был бы сказать "то естьT& гдеT обозначает типU &-or-&& обозначает типU &msgstr ", чтобы быть точным с
 fredoverflow22 февр. 2011 г., 16:22
Разве это не должно быть "то естьT& гдеT обозначает тип ссылкиT& снова"?
 Alexandre C.23 сент. 2010 г., 10:23
Отлично, я понял, что это можно решить с помощью классов черт, но я никогда не видел ничего подобного в [моей реализации] STL.

Ваш ответ на вопрос