【发布时间】:2012-12-10 17:17:53
【问题描述】:
这是关于 STL 实现在处理 std::string 的 const 副本方面的区别的问题。我有这么短的测试,它执行 2 个 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();
}
在我的带有 libstdc++.so.6.0.16 STL 的 gcc 4.6.2 上,所有指针都以相等的形式返回。
我可以依赖这种行为吗?
它是可移植的还是在最近的标准中定义的?
这是否适用于当前或未来版本的 libstdc++、libc++、Microsoft STL、stdcxx (apache.org)?
【问题讨论】:
-
我认为这是一个你不应该依赖的实现细节。
-
这是一个实现细节。语言规范中没有任何内容表明您可以依赖它。你只需要在一些不同的编译器上尝试一下就可以看到。例如尝试 VS。
-
请注意,C++11 中禁止使用 COW,因为 n2668:open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2668.htm
-
它在当前和未来版本的 libc++ 中都不起作用。
标签: c++ stl libstdc++ libc++ c-str