C ++ string.c_str()

时间:2017-11-27 16:41:36

标签: c++ undefined-behavior

如果使用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;
}

这是一种未定义的行为吗?

1 个答案:

答案 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;

是未定义的行为,因为临时不需要超过完成第一行的执行。