c++ - 为什么 CLS() 在 C++11 中有不同的含义

标签 c++ visual-c++ c++11 decltype

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/

相关文章:

c++ - typedef函数指针?

c++ - 内联汇编代码无法在 Visual C++ 2010 Express 中编译

c++ - C++ 编译器如何设法发出完全没有意义的代码?

c++ - 调用自动构造函数 : why is my type incomplete?

c++ - std::sort by unary 映射

java - 从 C++ 回调到 Java

C++ Libcurl 在较大内容的 readfunction 回调中导致写入访问冲突

c++ - webRTC : How to apply webRTC's VAD on audio through samples obtained from WAV file

C++ 匿名结构作为 std::map 值

c++ - std::result_of 简单函数