基本上这是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.
}
但它编译得很好并且没有错误。我查看了标准文档,但无法进行推理。
那么,我在这里错过了什么?
答案 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
。后一种解释是默认解释,这就是为什么编译器错误是由于尝试使用新声明的函数而产生的,就好像它是你期望的那样。