有人可以解释为什么以下工作,尝试以下代码,它工作正常。
class A {
public :
int32_t temp ;
A ( bool y = false ) { }
} ;
int main ( int argc, char *argv[] )
{
A temp ;
temp = new A () ;
temp.temp = 5 ;
std::cout << " " << temp.temp << std::endl ;
return EXIT_SUCCESS;
} // ---------- end of function main ----------
答案 0 :(得分:7)
在你的情况下。编译器使用implicitly defined Copy/Move Assignment operator。首先使用带有A
的构造函数构造带有指针的bool
。
C ++中的所有指针类型都是implicitly convertible到bool
。有两种方法可以防止这种废话:
explicit
施工人员deleted
施工人员因此,您可以这样做:
class A {
public :
int32_t temp ;
explicit A( bool y = false ) {
}
//Additionally
A(void*) = delete;
};
定义一个只删除void*
的构造函数,当传递指针时,overload resolution将构造函数的排名高于bool
构造函数。因为每当你传递一个指针时它会被重载决策选中,并且因为它被删除了,所以程序将会格式不正确。