2017-11-27 2 views
0

Wenn ich g++ und clang++ verwende, bekomme ich ++my string==my string##my string--. Während MSVC und Intel Compiler ist es ++==my string##my string--.C++ string.c_str()

Warum?

#include <string> 
#include <iostream> 

using namespace std; 

string test() 
{ 
    string s0 = "my string"; 
    return s0; 
} 

int main() 
{ 
    string s = test(); 
    const char* s1 = test().c_str(); 
    const char* s2 = s.c_str(); 
    cout << "++" << s1 << "==" << s2 << "##" << test().c_str() << "--" << endl; 
    return 0; 
} 

Ist es ein undefiniertes Verhalten?

+16

's1' verweist auf ein Objekt, das nicht mehr existiert. Es ist definitiv undefiniertes Verhalten, um daraus zu lesen. –

+0

Verwechseln Sie nicht undefiniertes Verhalten mit "undefinierte Übersetzung von Code zu Assembler". Vorausgesetzt, dass das beobachtbare Verhalten (wie der Ausdruck von der Sprache definiert wird) gleich bleibt, kann der Compiler den Code beliebig transformieren. Es ist bekannt als die [als-ob-Regel] (http://en.cppreference.com/w/cpp/language/as_if). –

+1

Mögliches Duplikat von [C++, das vorübergehende Objekte verwirrt] (https://stackoverflow.com/questions/12952295/c-returning-temporary-objects-confusion) – wally

Antwort

6

In einem Kommentar, werden Sie gefragt:

Warum test().c_str() arbeiten können, aber s1 nicht?

test().c_str() funktioniert nur in einigen Kontexten, nicht in allen Kontexten.

std::cout << test().c_str() << std::endl; 

ist garantiert, da die temporären durch test() erforderlich kehrte zur Arbeit zurück, am Leben zu bleiben, bis die Ausführung der Anweisung abgeschlossen ist.

Auf der anderen Seite,

char const* s1 = test().c_str(); 
std:cout << s1 << std::endl; 

ist nicht definiertes Verhalten, da die Zeit nicht erforderlich ist, über Beendigung der Ausführung der ersten Zeile zu leben.