Почему постоянная ссылка на переменную другого типа приемлема? - PullRequest
0 голосов
/ 03 ноября 2011

Я смотрел на http://msdn.microsoft.com/en-us/library/szywdw8k%28VS.80%29.aspx, и часть кода не имела для меня смысла.

int iVar;
const long& LongRef3 = iVar;   // OK

Почему LongRef3 может ссылаться на iVar, даже если они разных типов, когда LongRef3 объявлен константой?

В соответствии с этим: Почему постоянство ссылки влияет на возможность ее инициализации с помощью переменной другого типа?

«Потому что он создает временный int, где конвертируется double, и изменяемые ссылки не могут привязываться к временным файлам, тогда как константные могут». Это не имеет смысла для меня. Какой временный int создается?

Зачем мне это делать? Когда это будет полезно, если его объявить const int &?

И есть ли ограничения для каких типов я могу сделать это?

РЕДАКТИРОВАТЬ: Почему этот вопрос был отклонен? Мне кажется, я хорошо объяснил вопрос.

Ответы [ 3 ]

9 голосов
/ 03 ноября 2011
int iVar;
const long& LongRef3 = iVar;

Ссылка LongRef3 не относится к iVar, но является временным значением типа long, инициализированным из значения iVar. Код несколько похож на этот:

int iVar;
const long __injected_iVar__ = iVar;
const long& LongRef3 =  __injected_iVar__;

Вы можете попытаться увидеть, что произойдет, если вы сделаете &iVar против &LongRef3.

Зачем мне это делать? Когда это будет полезно, если его объявить const int &?

В таких простых случаях это может не быть полезным. Однако если аргумент функции принимает что-то по константной ссылке, то вы можете использовать в качестве такого аргумента совместимые типы и даже литералы.

И есть ли ограничения для каких типов я могу сделать это?

Только для совместимых типов; но он также применим к определенным пользователем структурам и классам, если они обеспечивают преобразования между ними.

0 голосов
/ 03 ноября 2011

"Почему не const int &"?

У вас может не быть выбора:

int foo(); // Not provided by you.
void bar(const long&); // Not provided by you either.

bar(foo()); // Works because the temporary long is bound.
0 голосов
/ 03 ноября 2011

Это всего лишь один аспект общей функции C ++, которая позволяет постоянным ссылкам связываться с временными файлами, и в процессе, продлевая срок службы временных.Вот:

Foo bar();

void f()
{
  bar();  // temporary dies at the semicolon

  const Foo & x = bar();  // temporary has its lifetime extended...

  // ...

}  // ... and dies only here, at the end of x's lifetime

Как уже было отмечено, ваш исходный код создает временный long, который затем привязывается к константной ссылке.

Продление срока службывременный может быть желательным, если вы не хотите делать копию или перемещать, или полагаться на RVO.Вероятно, это не одна из самых полезных функций языка, но там у вас есть.

...