2016-10-04 3 views
3

Kann jemand erklären, warum das folgende funktioniert, versuchte den folgenden Code und es funktioniert gut.Konvertierung vom Zeiger in den NonScalar-Objekttyp?

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 ---------- 

Antwort

7

In Ihrem Fall. Der Compiler verwendete implicitly defined Copy/Move Assignment operator. Welcher zuerst A mit dem Zeiger konstruiert, der Ihren Konstruktor verwendet, der eine bool nimmt.


Alle Zeigertypen sind implicitly convertible-bool in C++. Es gibt zwei Möglichkeiten, einen solchen Unsinn zu verhindern:

  • explicit Bauer
  • deleted Bauer

So können Sie dies tun:

class A { 

    public : 
    int32_t temp ; 
    explicit A(bool y = false ) { 
    } 

    //Additionally 
    A(void*) = delete; 
}; 

einen Konstruktor definiert, der nur nimmt eine void* wie gelöscht, wird overload resolution Rang, dass Konstruktor höher als die bool-Konstruktor, wenn Sie einen Zeiger übergeben. Da es bei jedem Übergeben eines Zeigers durch die Überladungsauflösung ausgewählt wird und weil es gelöscht wird, wird das Programm schlecht gebildet.

Verwandte Themen