2017-05-01 14 views
-4

end()の標準ライブラリ実装では、それを取得できるだけでなく、過去の値を設定することができます。これはなぜ許可されていますか?潜在的に問題につながることはありませんか?std :: vectorのend()を設定するのはなぜですか?

#include <vector> 
#include <iostream> 


int main(void) 
{ 
    std::vector<int> v; 
    v.push_back(1); 
    v.push_back(2); 
    v.push_back(3); 
    *v.end() = 2; // why am I allowed to do this? 
    std::cout << *v.end() << std::endl; 

    return 0; 
} 
+3

「許可」を定義します。 – immibis

+2

これを読む:[未定義の動作とは何ですか?](https://en.wikipedia.org/wiki/Undefined_behavior)あなたがそれを呼び出すので、それに慣れてください。 – WhozCraig

答えて

3

なぜこれが許可されていますか?

これはありません。 Undefined Behaviorを呼び出しています。このコードは、クラッシュや印刷を含む何らかの処理を行う可能性があります。

1

これは許可されていません。あなたのプログラムがクラッシュしていないからといって、それが許されているわけではありません。あなたの上司にそれを示すとき、あなたのプログラムは火曜日にクラッシュするかもしれません。あるいは、あなたは2を他の変数に書きました。

これはの未定義の動作と呼ばれ、特に何か起こることは期待できません。クラッシュすることは期待できません。

0

これはとなるでしょう。確かにが問題になり、標準では許可されていません(未定義の動作)。残念なことに、可能なすべての違反を診断するコンパイラを書くことはできません。そのようなコード構造は、標準に関する限り違法であってもコンパイルされます。

+0

この場合、それは実際には不可能ではない、それはものを遅くすることです。私が使用したすべての標準ライブラリの実装には、この種の問題を問題なく検出できるデバッグモードがいくつかありますが、生成されるコードが大幅に遅くなります。 –

関連する問題