如果使用g++
和clang++
,我会获得++my string==my string##my string--
。虽然是MSVC和英特尔编译器,但它是++==my string##my string--
。
为什么?
#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;
}
这是一种未定义的行为吗?
答案 0 :(得分:6)
在评论中,你问:
为什么
test().c_str()
可以正常工作但s1
没有?
test().c_str()
仅适用于某些情境,而非所有情境。
std::cout << test().c_str() << std::endl;
保证可以正常工作,因为test()
返回的临时值必须保持活动状态才能完成语句的执行。
另一方面,
char const* s1 = test().c_str();
std:cout << s1 << std::endl;
是未定义的行为,因为临时不需要超过完成第一行的执行。