Попытка создания временного объекта с использованием только имени класса в объявлении

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 года ОСАГО. Это не компилируется в g ++ 4.8.0 или лязг 3.2, который дает error: declaration does not declare anything [-fpermissive] а также fatal error: 'iostream' file not foundсоответственно.

4

Решение

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

Тип не является утверждением.

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

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

[D: \ DEV \ тест]
> (кл 2> 1) | найти / я "C ++"
Оптимизирующий компилятор Microsoft (R) C / C ++ версии 17.00.51025 для x86

[D: \ DEV \ тест]
> cl / nologo / EHsc / GR / W4 foo.cpp
foo.cpp

[D: \ DEV \ тест]
> g ++ -std = c ++ 0x -pedantic -Wall foo.cpp
foo.cpp: в функции 'int main ()':
foo.cpp: 17: 5: ошибка: объявление ничего не объявляет [-fpermissive]

[D: \ DEV \ тест]
> _

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

5

Другие решения

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

2

и то и другое g++ а также clang дай ошибку 17:5: error: declaration does not declare anything

Какой бы компилятор вы не использовали, он может полностью оптимизировать строку, но это всего лишь предположение. Что вы компилируете?

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

2
По вопросам рекламы [email protected]