2013-03-14 4 views
4

C++Покушение строительство временного объекта, используя только имя класса в объявлении

Объекты этого класса cout сек сообщений, когда они построены и уничтожены. Я попытался создать временный объект, используя объявление только имени класса, но он дал неожиданный результат.

В # 1 я создаю временный безымянный объект, используя круглые скобки.

В # 2 я создаю временный безымянный объект, используя единую инициализацию.

Я не знал, будет ли компиляция # 3. Я только думал, что если № 3 будет компилироваться, это означало бы создание временного безымянного объекта. Он компилируется, но объект не создается, как видно из пустоты вывода консоли под №3. Что здесь происходит?

#include <iostream> 

class A 
{ 
public: 
    A() {std::cout << "constructed\n";} 
    ~A() {std::cout << "destroyed\n";} 
}; 

auto main() -> int 
{ 
    std::cout << "#1:\n"; 
    A(); 
    std::cout << "#2:\n"; 
    A{}; 
    std::cout << "#3:\n"; 
    A; 
    return 0; 
} 

Консоль вывода:

#1: 
constructed 
destroyed 
#2: 
constructed 
destroyed 
#3: 

Примечание: Это был составлен в VC11 с ноября 2012 CTP. Он не компилируется в g++ 4.8.0 или clang 3.2, что дает error: declaration does not declare anything [-fpermissive] и fatal error: 'iostream' file not found, соответственно.

ответ

5

Код недействителен для всех стандартов C++ (C++ 98, C++ 03, C++ 11) и не должен компилироваться.

Тип не является инструкцией.

И действительно ни Visual C++, ни г ++ компилирует:

К сожалению, в то время как г ++ правильно диагностирует программы, ноябрь 2012 CTP из Visual C++ не делает:

 
[D:\dev\test] 
>(cl 2>&1) | find /i "C++" 
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.51025 for x86 

[D:\dev\test] 
>cl /nologo /EHsc /GR /W4 foo.cpp 
foo.cpp 

[D:\dev\test] 
>g++ -std=c++0x -pedantic -Wall foo.cpp 
foo.cpp: In function 'int main()': 
foo.cpp:17:5: error: declaration does not declare anything [-fpermissive] 

[D:\dev\test] 
> _ 

Так что это ошибка компилятора, и вы можете попробовать сообщить об этом в Microsoft Connect.

2

Я пробовал свой код в gcc версии 4.5.3, когда компилировался, он дал следующее сообщение об ошибке: «error: declare ничего не объявляет», Какой тип компилятора вы используете? Очень возможно, что вы компилятор что-то делает под капотом.

+0

Я скомпилировал его в VC11 w/Nov. 2012 CTP. Я отредактировал свой OP, чтобы включить эту информацию. – CodeBricks

2

как g++ и clang дают ошибку 17:5: error: declaration does not declare anything

Независимо компилятор вы используете, может быть оптимизируя из строки целиком, но это только предположение. С чем вы работаете?

Это не законный афайк. точно так же, как int; не является юридическим заявлением.

+0

Я скомпилировал его в VC11 w/Nov. 2012 CTP. Я отредактировал свой OP, чтобы включить эту информацию. – CodeBricks

+0

@xhainingx «оптимизация» на самом деле не лучшее слово для этого, это ошибка для принятия неверного кода (если это не намеренное расширение) –

+0

@StephenLin Я имел в виду, что это больше похоже на то, что компилятор как-то избавляется от оптимизации, чем преднамеренная оптимизация. это может быть случайно замечено как заявление без эффекта –

 Смежные вопросы

  • Нет связанных вопросов^_^