【发布时间】:2011-06-14 10:04:47
【问题描述】:
尝试编译:
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.2 和Q10.21 中描述的案例),但我不熟悉这个。
【问题讨论】:
-
啊,是的,符号名称周围的括号显然是合法的,就像函数指针声明的典型情况一样。耶。
-
您还可以通过将
AnonymousClass(x)强制为子表达式来防止AnonymousClass(x)被视为x的定义。例如(void) AnonymousClass(x);。从语法上讲,这不可能是一个定义,因此它是一个表达式语句,它使用单参数构造函数创建一个对象,然后将其销毁。
标签: c++