2012-12-10 51 views
2

这是关于处理std::string的const副本的STL实现之间的区别的问题。我有这样简短的测试,它不通过c_str()回到2常量复印和打印地址:C++ STL:创建std :: string的const拷贝时会不会改变c_str()?

#include <stdio.h> 
#include <string> 
using namespace std; 
int main() 
{ 
      string a("Hello World!"); 
    const string b(a); 
    const string c(b); 

    printf("a: %p = %s\n", a.c_str(), a.c_str()); 
    printf("b: %p = %s\n", b.c_str(), b.c_str()); 
    printf("c: %p = %s\n", c.c_str(), c.c_str()); 
    return c.c_str() == b.c_str(); 
} 

在我的gcc 4.6.2的libstdC++ STL so.6.0.16所有指针都返回相等。

我可以依靠这种行为吗?

它是便携式还是在最近的标准中定义?

这项工作将在libstdC++,libC++,Microsoft STL,stdcxx(apache.org)的当前版本或未来版本上运行吗?

+0

我认为这是一个你不应该依赖的实现细节。 – 2012-12-10 17:19:28

+0

这是一个实现细节。语言规范中没有任何内容表明您可以依赖于此。 你只需要在一些不同的编译器上试试看。例如尝试VS. –

+3

请注意,COW在C++ 11中是禁止的,因为n2668:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2668.htm – ecatmur

回答

3

你根本不能依赖那种行为。关于c_str(),唯一保证的是返回的指针是有效的,直到基础string发生变化(特定的方法/功能使返回的指针无效)。你不能保证它可以在任何特定的体系结构或编译器上工作,并且不应该依赖这种行为。

+0

但一些流行的Linux程序确实依赖于这.... – osgx

相关问题