Возможно, я один, но я думаю, что это небезопасно:
const int &x = (int &&)123;
Правила продления жизни применяются только тогда, когда ссылка инициализируется выражением, которое непосредственно ссылается на временный объект.Другими словами, выражение должно содержать атрибут «временный».Если вы пропустите (int&&)
, то для привязки к ссылке компилятор неявно создаст выражение prvalue, которое ссылается на временный объект, который инициализируется значением 123
, и затем применяется удлинение времени жизни.
Но если вы смешиваете rvalue-ссылки между ними, компилятор не сможет узнать во время время компиляции , продлевать или нет время жизни ссылаемого объекта.
int a = 0;
const int &x = ((rand() == 42) ? (int&&)123 : (int&&)a);
I для этогодумайте, что ваш код имеет неопределенное поведение, потому что вы оцениваете висячую ссылку (даже если только для получения ее адреса).