为什么这不是一个令人烦恼的解析?

时间:2011-05-08 08:08:12

标签: c++ most-vexing-parse

基本上这是this question关于最令人烦恼的解析的后续行动。我可以理解这是由于函数声明和变量定义之间的模糊性。

但是在Comeau在线,我只是厌倦了以下内容。

class T{

public:

    T(int i){
    }

    int fun1(){
        return 1;
    }

};

int main()
{
    T myT(10); // I thought it'd be a function declaration that takes an int and returns a type T
    myT.fun1(); // and a compiler error out here.
} 

但它编译得很好并且没有错误。我查看了标准文档,但无法进行推理。

那么,我在这里错过了什么?

3 个答案:

答案 0 :(得分:7)

因为10不是类型。 :)

这将是一个最令人烦恼的解析:

T myT(T());
// T() gets interpreted as function pointer argument to a function returning T();
// This is equivalent to:
T myT(T (*fn)());

另一种最令人烦恼的解析是这一个:

unsigned char c = 42;
T myT(int(c));
// int(c) gets interpreted as an int argument called c.
// This is equivalent to:
T myT(int c);

答案 1 :(得分:6)

10不能是参数类型名称,因此必须是变量声明。

编译器必须在能够做到这一点时选择一个函数声明,但在很多情况下它不能这样做,并且没有歧义。

答案 2 :(得分:3)

这不是一个令人烦恼的解析,因为你使用整数字面而不是说:

T myT(T());

如同这个完整的例子:

#include <iostream>

struct T { int f() { return 1; } };

int main(int argc, char** argv) {
    T t(T());
    std::cout << t.f() << '\n';
    return 0;
}

这是不明确的,因为它可能意味着:

  • myT是使用默认构造的T初始化的T;或
  • myT是一个函数,返回T并取一个类型T()的参数,表示零参数函数,其返回类型也是T

后一种解释是默认解释,这就是为什么编译器错误是由于尝试使用新声明的函数而产生的,就好像它是你期望的那样。

请参阅the Wikipedia article