0
g++
とclang++
を使用する場合、++my string==my string##my string--
が得られます。 MSVCとインテルコンパイラの間は++==my string##my string--
です。C++ string.c_str()
なぜですか?
#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;
}
これは未定義の動作ですか?コメントで
's1'はもはや存在しないオブジェクトを指します。それを読むには、明確に定義されていない動作です。 –
未定義の動作を "コードからアセンブラへの未定義の変換"と混同しないでください。観察可能な振る舞い(言葉によって定義されるように)が同じであれば、コンパイラはどのような方法でもコードを変換することができます。これは[そのままの場合のルール](http://en.cppreference.com/w/cpp/language/as_if)として知られています。 –
一時的なオブジェクトの混乱を返す[C++の重複]の可能性があります(https://stackoverflow.com/questions/12952295/c-returning-temporary-objects-confusion) – wally