gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:46 24 4
gpt4 key购买 nike

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.cppfoo.cpp[D:\dev\test]> g++ -std=c++0x -pedantic -Wall foo.cppfoo.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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com