为什么从另一个类类型进行c ++类初始化时不会抛出错误?

时间:2019-04-16 07:15:42

标签: c++ c++14

我期望编译器从另一个类型的临时变量初始化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&)”

1 个答案:

答案 0 :(得分:3)

您遇到了最烦人的解析。这个

C c(B());                                                                      

是一个名为c的函数的声明,该函数返回一个C对象,并且具有一个类型为B的参数(即使有可选的括号,也没有给出名称)。您已经有了C c(b)的修复程序,但请注意,使用花括号进行初始化也有帮助:

C c{B{}};   // error                                                                   

请注意,它的最新版本gccclang提供了非常有用的诊断信息,例如clang++。没有任何特定的警告标志说明

  

警告:括号被作为函数声明[-Wvexing-parse]消除了歧义

C c(B());
 ^~~~~