【问题标题】:why c++ class initialisation from another class type not throwing an error? [duplicate]为什么从另一个类类型初始化 C++ 类不会引发错误? [复制]
【发布时间】:2019-04-16 15:29:07
【问题描述】:

我期待编译器从另一个类型的临时变量初始化 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;                                              
}     

在这里,我为 bool 类型的非类型参数和值为 false 的非类型参数专门设置了 A 类,因此它只有编译器生成的标准构造函数,它不应该接受任何其他类型作为初始化参数。

为简化起见,我使用了 C 类,结果相同(编译时没有错误)。

但如果我这样做 C c(b); 它会导致我期望的错误:错误:没有匹配函数调用'C::C(B&)'

【问题讨论】:

  • 编译器考虑函数已声明,但未定义

标签: c++ c++14


【解决方案1】:

您遇到了最令人头疼的解析。这个

C c(B());                                                                      

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

C c{B{}};   // error                                                                   

请注意,gccclang 的最新版本提供了非常有用的诊断,clang++ 例如没有任何具体的警告标志的言论

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

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

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 2021-11-26
    • 2021-07-08
    • 1970-01-01
    • 2013-10-14
    • 2012-07-20
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多