Код: Выделить всё
CString DoSomething( const CString& sString )
{
return sString;
}
CString sTest1 = DoSomething( sTest1 ); // Compiles (no warnings), fails at runtime
CString sTest2( DoSomething( sTest2 ) ); // Doesn't compile
CString sTest3; sTest3 = DoSomething( sTest3 ); // Compiles, self-assignment, works
Теперь я понимаю, почему Test1 не работает и почему Test2 не компилируется. Что мне интересно, так это то, почему Test1 вообще компилируется? Разрешено ли это стандартом, открытым для интерпретации, недостатком компилятора VS2008, недостатком статической проверки инициализации перед использованием или чем-то еще? Есть ли способ заставить компилятор хотя бы выдать предупреждение в этом случае (Test1, похоже, компилируется чисто с максимальным уровнем предупреждения под VS2008)? Каково было бы обоснование спецификации C++, разрешающей эту конструкцию?
Изменить: альтернативно, есть ли какой-либо способ заставить компилятор скомпилировать Test1 как Test2 (и, таким образом, вызвать error)?
Изменить, чтобы добавить дословное сообщение об ошибке для Test2:
ошибка C2065: 'sTest2': необъявленный идентификатор
Подробнее здесь: https://stackoverflow.com/questions/731 ... nitialized
Мобильная версия