我期望编译器从另一个类型的临时变量初始化c ++类型时引发错误。
template <bool>
struct A{
A(...);
};
template <> struct A<false>{
};
class B{
};
class C{
int i;
};
int main()
{
//A a;
B b;
C c(B());
A<false> aa(B());
cout << "Hello World!!" << endl;
}
在这里,我有一个专门的类A用于bool类型和false值的非类型参数,因此它只有编译器生成的标准构造函数,不应接受任何其他类型作为初始化参数。
为简化起见,我使用了具有相同结果的C类(编译时没有错误)。
但如果我这样做 C c(b); 它会导致我预期的错误:error:没有匹配的函数可以调用“ C :: C(B&)”
答案 0 :(得分:3)
您遇到了最烦人的解析。这个
C c(B());
是一个名为c
的函数的声明,该函数返回一个C
对象,并且具有一个类型为B
的参数(即使有可选的括号,也没有给出名称)。您已经有了C c(b)
的修复程序,但请注意,使用花括号进行初始化也有帮助:
C c{B{}}; // error
请注意,它的最新版本gcc
和clang
提供了非常有用的诊断信息,例如clang++
。没有任何特定的警告标志说明
警告:括号被作为函数声明[-Wvexing-parse]消除了歧义
C c(B()); ^~~~~