Преобразование из указателя в нескалярный тип объекта?
Может кто-нибудь объяснить, почему работает следующее, пробовал следующий код и работает нормально.
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 ----------
1 ответ
В твоем случае. Компилятор использовал неявно определенный оператор копирования / перемещения. Какие первые конструкции A
с указателем, используя ваш конструктор, который принимает bool
,
Все типы указателей неявно преобразуются в bool
в C++. Есть два способа предотвратить такую ерунду:
explicit
конструкторыdeleted
конструкторы
Таким образом, вы можете сделать это:
class A {
public :
int32_t temp ;
explicit A( bool y = false ) {
}
//Additionally
A(void*) = delete;
};
определяя конструктор, который принимает только void*
как удалено, будет иметь ранг разрешения перегрузки, что конструктор выше, чем bool
конструктор, когда вы передаете указатель. Так как он будет выбираться по разрешению перегрузки всякий раз, когда вы передаете указатель, и поскольку он удален, программа будет неправильно сформирована.