c++ - 这个 AnonymousClass(variable) 声明中到底发生了什么?

标签 c++

尝试编译:

class AnonymousClass
{
public:
    AnonymousClass(int x)
    {
    }
};


int main()
{
    int x;
    AnonymousClass(x);
    return 0;
} 

从 MSVC 生成错误:

foo.cpp(13) : error C2371: 'x' : redefinition; different basic types
    foo.cpp(12) : see declaration of 'x'
foo.cpp(13) : error C2512: 'AnonymousClass' : no appropriate default constructor available

g++ 的错误信息类似:

foo.cpp: In function ‘int main()’:
foo.cpp:13: error: conflicting declaration ‘AnonymousClass x’
foo.cpp:12: error: ‘x’ has a previous declaration as ‘int x’
foo.cpp:12: warning: unused variable ‘x’

通过为 AnonymousClass 对象指定一个显式名称很容易解决这个问题,但是这里发生了什么,为什么?我认为这是更多的声明语法怪异(如 comp.lang.C++ 常见问题解答的 Q10.2Q10.21 中描述的情况),但我对此并不熟悉。

最佳答案

AnonymousClass(x);

它定义了一个 AnonymousClass 类型的变量 x。这就是您收到重定义错误的原因,因为 x 已声明为 int

括号多余。您可以添加更多大括号,例如:

AnonymousClass(x);
AnonymousClass((x));
AnonymousClass(((x)));
AnonymousClass((((x))));
//and so on

它们都与:

AnonymousClass x;

演示:http://www.ideone.com/QnRKH


您可以使用语法 A(x) 来创建匿名对象,尤其是在调用函数时:

int x = 10;
f(A(x));        //1 - () is needed
f(A((((x)))));  //2 - extra () are superfluous

12 都调用函数 f 并传递 A 类型的对象:

但是,额外括号在 2 行仍然是多余的。

关于c++ - 这个 AnonymousClass(variable) 声明中到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6341951/

相关文章:

c++ - MSVC 接受用 nullptr 初始化的指向 int 的常量指针作为常量表达式

将函数转换为函数对象类型的 C++ 模板

c++ - 为什么在 for 循环中使用 std::for_each?

c++ - 如何连续读取标准输入?

c++ - C++多线程数据同步

c++ - Visual Studio 跨平台生成文件项目,找不到命令

C++ 模板类给出没有明显错误的语法错误

Android C++ 应用程序在链接到共享库阶段崩溃

c++ - 什么是好的游戏随机数生成器?

c++ - 如何交换链表 C++ 的索引