从指针转换为非标量对象类型?
Conversion From Pointer To NonScalar Object Type?
谁能解释一下为什么下面的代码有效,试过下面的代码,它工作正常。
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 ----------
在你的情况下。编译器使用了 implicitly defined Copy/Move Assignment operator。首先使用带有 bool
.
的构造函数使用指针构造 A
所有指针类型在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
构造函数。因为每当你传递一个指针时它都会被重载决议选中并且因为它被删除了,程序将是错误的。
谁能解释一下为什么下面的代码有效,试过下面的代码,它工作正常。
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 ----------
在你的情况下。编译器使用了 implicitly defined Copy/Move Assignment operator。首先使用带有 bool
.
A
所有指针类型在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
构造函数。因为每当你传递一个指针时它都会被重载决议选中并且因为它被删除了,程序将是错误的。