2012-12-10 74 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

相關問題