这个AnonymousClass(变量)声明实际上发生了什么?

jam*_*lin 7 c++

试图编译:

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


int main()
{
    int x;
    AnonymousClass(x);
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

从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
Run Code Online (Sandbox Code Playgroud)

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’
Run Code Online (Sandbox Code Playgroud)

通过给AnonymousClass对象一个明确的名称可以很容易地修复它,但是这里发生了什么以及为什么?我认为这是更多的声明语法怪异(如comp.lang.C++ FAQ的Q10.2Q10.21中描述的情况),但我不熟悉这个.

Naw*_*waz 10

AnonymousClass(x);
Run Code Online (Sandbox Code Playgroud)

它定义了一个x类型的变量AnonymousClass.这就是为什么你得到重定义错误,因为x已经声明为int.

括号是多余的.您可以添加更多大括号,例如:

AnonymousClass(x);
AnonymousClass((x));
AnonymousClass(((x)));
AnonymousClass((((x))));
//and so on
Run Code Online (Sandbox Code Playgroud)

所有这些都与:

AnonymousClass x;
Run Code Online (Sandbox Code Playgroud)

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


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

int x = 10;
f(A(x));        //1 - () is needed
f(A((((x)))));  //2 - extra () are superfluous
Run Code Online (Sandbox Code Playgroud)

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

但同样,额外的括号仍然是多余的2.

  • @jamesdlin:parens也用于声明数组引用和指针.例如,`AnonymousClass*ptr [3]`具有与`AnonymousClass(*ptr)[3]`不同的类型.它实际上不是允许特殊情况的奇怪语法的情况 - 对于简单类型,通常的语法恰好是奇怪的(因为它看起来与表达式中的含义不一致,即构造一个带有1个arg的临时语句). (5认同)