c++ - 尝试在声明中仅使用类名构造临时对象

标签 c++ c++11 constructor declaration uniform-initialization

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

最佳答案

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

类型不是语句。

事实上,Visual C++ 和 g++ 都无法编译它:

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

[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 报告它。 .

关于c++ - 尝试在声明中仅使用类名构造临时对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15399923/

相关文章:

c++ - 如何在包含 typedef 的情况下使用从右到左的规则解释变量声明?

c++ - 派生类特定函数,在重写的虚函数内,由基类指针调用

c++ - 使用构造函数初始化字符串指针

C++抽象类问题

c++ - 将基类构造函数复制到子类?

c++ - 使用不同的构造函数创建类的实例

c++ - 从其他线程更新 QT Graphicview

C++:通过类成员方法访问类成员

c++ - BidirectionalIterator 的 decltype(*it) 是什么?

c++ - 来自抽象类的 unique_ptr 的 shared_ptr