VS2010 已经部分支持C++11。我在 VS2010 RTM 中编译了下面的代码。我很困惑为什么代码 CLS() 被分析为不同的含义。在“decltype(CLS()) obj1;”这一行中,CLS() 表示类对象实体。但是在“CLS obj2(CLS());”这一行中,CLS() 表示一个函数指针,它返回一个没有参数的 CLS 对象。这种行为是预期的吗?标准中有描述吗?
struct CLS
{
int mi;
};
int _tmain(int argc, _TCHAR* argv[])
{
decltype(CLS()) obj1;
obj1.mi = 10;
CLS obj2(CLS());
obj2.mi = 10; // error C2228: left of '.mi' must have class/struct/union
return 0;
}
2011 年 12 月 8 日更新
根据 C++11 7.1.6.2/1,括号中的预期字符串是一个表达式。编译器只需要检查字符串是否可以解析为有效表达式。如果是,则代码格式正确。因此对于代码“decltype(CLS()) obj1;”,“CLS()”被视为表示对象定义的有效表达式。
decltype-specifier:
decltype ( expression )
2012 年 1 月 3 日更新
Potatoswatter 解释了为什么“CLS obj2(CLS());”是对象定义以外的声明。
任何可以被解释为表达式或声明的东西都是声明,无论它多么不寻常。 CLS obj2( CLS() );声明一个函数,其参数类型 CLS() 是一个没有参数返回 CLS 的函数,并且其返回类型为 CLS。
最佳答案
是否预期:是
它被称为“most vexing parse”。
CLS obj2(CLS()); // function forward declaration.
CLS obj2 = CLS(); // Creates object zero initialized.
CLS obj2; // Creates object default initialized.
关于c++ - 为什么 CLS() 在 C++11 中有不同的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8410433/