4 Stimmen

C++ Scoping und Zweideutigkeit bei Konstruktorüberladungen

Ich habe den folgenden Codeschnipsel in 3 verschiedenen Compilern (G++, clang++, CL.exe) ausprobiert, und sie alle melden mir, dass sie die überladenen Konstruktoren nicht disambiguieren können. Ich weiß jetzt, wie ich den Aufruf des Konstruktors ändern könnte, damit er das eine oder das andere auswählt (entweder explizit machen, dass das zweite Argument ein vorzeichenloser literaler Wert ist oder es explizit casten).

Allerdings bin ich neugierig, warum der Compiler versuchen würde, zwischen Konstruktoren in erster Linie zu wählen, da einer der Konstruktoren privat ist und der Aufruf des Konstruktors in der Hauptfunktion erfolgt, die außerhalb des Anwendungsbereichs der Klasse liegen sollte.

Kann mich jemand aufklären?

class Test
{
private:
        Test(unsigned int a, unsigned int *b) { }
public:
        Test(unsigned int a, unsigned int b) { }
};

int main()
{
        Test t1 = Test(1,0);  // compiler is confused
}

6voto

Johannes Schaub - litb Punkte 479831

In C++ hat die Zugänglichkeit zu Klassenmitgliedern keinen Einfluss auf die andere Semantik der Sprache. Stattdessen führt jeder ungültige Zugriff dazu, dass ein Programm schlecht geformt ist.

Mit anderen Worten: Es gibt Zugänglichkeit y Sichtbarkeit . Der Standard hat es auf den Punkt gebracht

Es ist zu beachten, dass der Zugang zu Mitgliedern und Basisklassen kontrolliert wird, nicht deren Sichtbarkeit. Namen von Mitgliedern sind immer noch sichtbar, und implizite Konvertierungen in Basisklassen werden auch dann berücksichtigt, wenn diese Mitglieder und Basisklassen unzugänglich sind. Die Interpretation eines bestimmten Konstrukts wird ohne Rücksicht auf die Zugriffskontrolle festgelegt. Wenn die ermittelte Interpretation unzugängliche Membernamen oder Basisklassen verwendet, ist das Konstrukt nicht formgerecht.

1voto

Frunsi Punkte 7019

Der Compiler versucht nicht, eine überladene Funktion oder einen überladenen Konstruktor anhand ihrer Sichtbarkeit auszuwählen.

1voto

Charles Beattie Punkte 5419

Vielmehr wird der Compiler eine Kandidatenfunktion nicht ablehnen, auch wenn sie als privat gekennzeichnet ist. Das bedeutet, dass die Änderung der Sichtbarkeit eines Mitglieds keine Änderung des bestehenden Codes zur Folge hat.

1voto

jwismar Punkte 12035

Was Ihre zweite Frage betrifft, so erfolgt die Auflösung der Überlast vor der Prüfung der Sichtbarkeit.

Im ersten Fall müssen Sie dem Compiler mitteilen, dass die 0 ein unsigned int ist. Für den Compiler ist die Umwandlung von integer 0 in unsigned int nicht besser als die Umwandlung von integer 0 in pointer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X