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 年 11 月 CTP 编译的。它不能在g++ 4.8.0或 clang 3.2 中编译,分别给出error: declaration does not declare anything [-fpermissive]fatal error: 'iostream' file not found

4

3 回答 3

5

该代码在所有 C++ 标准(C++98、C++03、C++11)下均无效,不应编译。

类型不是语句。

事实上,Visual C++ 和 g++ 都没有编译它:

糟糕,虽然 g++ 可以正确诊断程序,但 Visual C++ 的 2012 年 11 月 CTP 没有:

[D:\开发\测试]
> (分类 2>&1) | 查找 /i "C++"
Microsoft (R) C/C++ 优化编译器版本 17.00.51025 for x86

[D:\开发\测试]
> cl /nologo /EHsc /GR /W4 foo.cpp
foo.cpp

[D:\开发\测试]
> g++ -std=c++0x -pedantic -Wall foo.cpp
foo.cpp:在函数'int main()'中:
foo.cpp:17:5: 错误:声明没有声明任何东西 [-fpermissive]

[D:\开发\测试]
> _

所以这是一个编译器错误,您可以尝试在Microsoft Connect上报告它。

于 2013-03-14T02:21:00.500 回答
2

我在 gcc 4.5.3 版中尝试了你的代码,当我编译时,它给出了以下错误消息:“错误:声明没有声明任何东西”,你使用什么样的编译器?您的编译器很有可能在幕后做了一些事情。

于 2013-03-14T02:19:50.830 回答
2

两者g++clang给出错误17:5: error: declaration does not declare anything

无论您使用什么编译器,都可能完全优化了这条线,但这只是一种推测。你在用什么编译?

这不合法。就像int;不是法律声明。

于 2013-03-14T02:21:22.983 回答