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

时间:2011-06-14 10:04:48

标签: 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 ++ FAQ的Q10.2Q10.21中描述的情况),但我不熟悉这个。

3 个答案:

答案 0 :(得分:10)

AnonymousClass(x);

它定义了x类型的变量AnonymousClass。这就是为什么你得到重新定义错误,因为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行仍然是多余的。

答案 1 :(得分:3)

您缺少变量/对象的实际名称:

AnonymousClass myclass(x);

而不是你可以写...

AnonymousClass (myclass)(x);

因此,您的代码行会产生以下结果:

AnonymousClass (x);

或更常见:

AnonymousClass x;

为什么会这样?括号只是用于逻辑分组(“什么属于一起?”)。唯一的区别是,他们被迫争吵(即你不能只写AnonymousClass myclass x)。

答案 2 :(得分:0)

为了避免这样的错误,请记住一条规则:如果您使用一个参数声明一个匿名对象,只需将其放入一对括号中即可!