2016-02-25 12 views
5

なぜ有効ですか? 2つの異なる文字列"testString"がありますが、ベクトルサイズは正しく割り当てられています。std :: beginとstd :: endを使用したベクトルの初期化

#include <iostream> 
#include <vector> 
#include <iterator> 

int main() 
{ 
    std::vector<char> str; 
    str.assign(std::begin("testString"), std::end("testString")); 
    copy(str.begin(), str.end(), std::ostream_iterator<char>(std::cout, " ")); 

    std::cout<<str.size(); 

    return 1; 
} 
+0

答えが見つかった場合は、[受け入れる](http://meta.stackexchange.com/a/5235/225842)してください。 – Antonio

答えて

9

string pooling最適化を実行したことがあります。あなたがやっていることは未だ定義されていない動作であり、異なるコンパイラや異なるコンパイラ設定ではあなたはあまり運がないであろうことに注意してください。二度とするな。

2

2つの同一のリテラル文字列は、メモリ内の単一の文字列に結合されている可能性が最も高いため、先頭と末尾が同じ文字列を参照します。コンパイラがで別の場所で使用されているのと同じ文字列リテラルを保存するために許可されているので

しかし、あなたのプログラムで「事故」でのみ動作...

これは多少関連How Do C++ Compilers Merge Identical String Literals

2

ですおそらく1つの場所がstd::begin("testString")std::end("testString")の両方が同じ文字列を参照している可能性があります。

これは標準では必須ではなく、コンパイラは両方の文字列リテラルを異なる場所に格納して、このコードを破ることができます。それが働いているからといって、あなたがこれをするべきではありません。私はいっそ

std::vector<char> str; 
const char [] chstr = "testString" 
str.assign(std::begin(chstr), std::end(chstr)); 

かを使用することをお勧めし

2

は、彼らはあなたのケースでも同じだ "たTestString" 二つの異なる文字列があります。コンパイラは、等しいか重複するストレージを組み合わせることができます string literals

コンパイラは、許可されますが同等または重複文字列リテラル用のストレージを組み合わせることが、を必要とされていません。つまり、同じ文字列リテラルは、ポインタで比較するとと等しいかどうかを比較することができます。

LIVE

std::cout << std::boolalpha << ("testString"=="testString"); 

はとにかく、あなたはそれに依存するべきではありません

あなたがすることによってそれを確認することができますが、動作は保証されません。

関連する問題