Преобразование из указателя в нескалярный тип объекта?

Может кто-нибудь объяснить, почему работает следующее, пробовал следующий код и работает нормально.

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 конструктор, когда вы передаете указатель. Так как он будет выбираться по разрешению перегрузки всякий раз, когда вы передаете указатель, и поскольку он удален, программа будет неправильно сформирована.

Другие вопросы по тегам