Почему это компилируется (используется в функции перед инициализацией)?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему это компилируется (используется в функции перед инициализацией)?

Сообщение Anonymous »

Рассмотрим этот код (с использованием CString, поскольку он знаком и его легко увидеть, когда он не создан, но в классе нет ничего особенного), протестированном в Visual Studio 2008:

Код: Выделить всё

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
Насколько я понимаю стандарт C++, Test1 можно автоматически скомпилировать в Test2 в результате оптимизации во время компиляции, при условии, что доступен соответствующий конструктор (который по умолчанию будет генерируется так, чтобы быть идентичным первому тесту). Примечательно, однако, что его поведение отличается от Test3, который будет работать правильно.

Теперь я понимаю, почему Test1 не работает и почему Test2 не компилируется. Что мне интересно, так это то, почему Test1 вообще компилируется? Разрешено ли это стандартом, открытым для интерпретации, недостатком компилятора VS2008, недостатком статической проверки инициализации перед использованием или чем-то еще? Есть ли способ заставить компилятор хотя бы выдать предупреждение в этом случае (Test1, похоже, компилируется чисто с максимальным уровнем предупреждения под VS2008)? Каково было бы обоснование спецификации C++, разрешающей эту конструкцию?

Изменить: альтернативно, есть ли какой-либо способ заставить компилятор скомпилировать Test1 как Test2 (и, таким образом, вызвать error)?

Изменить, чтобы добавить дословное сообщение об ошибке для Test2:
ошибка C2065: 'sTest2': необъявленный идентификатор

Подробнее здесь: https://stackoverflow.com/questions/731 ... nitialized
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»