Ссылки на константы могут быть инициализированы литералами и временными значениями, поскольку их можно легко преобразовать в явные переменные:
int const& ans = 42;
// tranformed:
int __internal_unique_name = 42;
int const& ans = __internal_unique_name;
Или, если время жизни не продлено, например, параметр функции:
f("foobar");
// transformed:
{
string __internal_unique_name = "foobar";
f(__internal_unique_name);
}
(Обратите внимание на явный блок в этом случае.)
Хотя возможно сделать что-то подобное в неконстантном случае, это просто недопустимо в токе C ++.C ++ 0x (следующий стандарт), однако, будет иметь ссылки на r-значения.
Если неясно, ref + 6
из вашего кода создает временный объект, который вы можете визуализироватьas:
int const& ref = int(9);
int const& another_ref = int(ref + 6);
// transformed:
int __A = 9;
int const& ref = __A;
int __B = ref + 6;
int const& another_ref = __B;
Это может помочь вам понять / визуализировать происходящее, но вы не должны писать настоящий код, подобный этому.Также я использовал двойные имена подчеркивания, чтобы проиллюстрировать, что эти имена являются деталями реализации (используются компилятором) и не должны использоваться вами.Любое имя, которое содержит соседние подчеркивания, зарезервировано для реализации C ++.