Foo & foo = Bar () разрешен или является проблемой компилятора - PullRequest
1 голос
/ 31 октября 2011
struct Foo {};
struct Bar : Foo {};

Foo &foo = Bar(); // without const

Как написано в ответах и ​​комментариях к этому вопросу , я не могу присвоить ссылку на ссылку.Тем не менее, я могу скомпилировать этот код (MSVC ++ 2010) без ошибок или предупреждений.Это известная проблема моего компилятора?

Ответы [ 2 ]

10 голосов
/ 31 октября 2011

Временные ссылки не привязываются к непостоянным ссылкам.Это просто способ, которым разработан язык.

Хотя в принципе нет технических препятствий для разрешения неконстантного доступа к временным файлам, это почти всегда будет плохим дизайном и довольно часто является логически ошибочнымСтандарт просто не позволяет этого.Если вы чувствуете необходимость изменить временный объект, вам следует переосмыслить, почему вы хотите это сделать.

1 голос
/ 31 октября 2011

Вы присваиваете временное значение для ссылки.Это временно, потому что здесь Bar() действует как функция, которая возвращает экземпляр Bar, который испарится в области видимости и в выражении, которая находится здесь в конце строки.Это очень опасно и незаконно, потому что разыменование foo создает неопределенное поведение.Я понятия не имею, почему MSVC ++ допускает эту «особенность», которая должна быть серьезной ошибкой.

С уровнем предупреждения 4 (/ W4) вы получите

warning C4239: nonstandard extension used : 'initializing' : conversion from 'Bar' to 'Bar &'

Вы всегда должны писать код суровень предупреждения 4.
Наконец, ответ @ KerrekSB лучше моего, вы должны выбрать его 'в качестве ответа.

...