Was garantiert, dass die überladene nicht-konstante Methode aufgerufen wird?

8

Gegeben diese 2 Funktionen, die eine Zeichenfolge ändern und zurückgeben:

%Vor%

Dieser Code funktioniert für mich mit GCC g ++, aber ich verstehe nicht warum / wie. Ich würde mir Sorgen machen, dass die zweite Funktion sich selbst nennen würde und mich mit einer außer Kontrolle geratenen Rekursion zurücklassen würde, bis der Stack erschöpft ist. Funktioniert das garantiert?

    
Stéphane 01.05.2013, 19:40
quelle

3 Antworten

9

Sie haben zwei überladene Funktionen:

%Vor%

Was Sie weitergeben, ist eine nicht const-qualifizierte std::string . Daher ist die Funktion, die das non const-qualified-Argument verwendet, besser geeignet. Wenn das nicht existierte, könnte der die nicht const-qualifizierte Zeichenkette in eine const-qualifizierte Zeichenkette umwandeln, um den Aufruf zu machen, aber für die Funktionsüberladung ist ein Aufruf, der keine Konvertierung benötigt, besser geeignet ein Anruf, der eine Konvertierung erfordert.

    
Jerry Coffin 01.05.2013, 19:48
quelle
3
%Vor%

Nein. Es ist nicht Rekursion. Es würde die andere Überladung aufrufen, deren Parameter std::string & ist.

Dies liegt daran, dass der Typ des Ausdrucks s std::string & mit dem Parametertyp der anderen überladenen Funktion übereinstimmt.

Um zu rekursiv zu werden, muss das Argument auf der Call-Site in std::string const & konvertiert werden. In Ihrem Fall ist diese Konvertierung jedoch unnötig , da eine Überladung vorliegt, die keine Konvertierung erfordert.

    
Nawaz 01.05.2013 19:45
quelle
1

Dies ist keine Rekursion, es ist überladen. Wenn Sie die zweite Funktion aufrufen, wird als Argument eine konstante Zeichenfolge verwendet. Innerhalb dieser Funktion rufen Sie die andere Funktion auf, die eine nicht konstante Zeichenfolge annimmt. Was Sie tun, ist das Abstreifen der Konstanten der Zeichenkette und ein besserer Weg das zu tun wäre, const_cast zu verwenden.

Ich verlinke einfach auf diesen anderen stackoverflow-Thread.

    
Shaz 01.05.2013 19:52
quelle

Tags und Links