2016-11-12 3 views
2
#include <iostream> 
using namespace std; 

struct S { 
    int m_i; 
}; 

int main() { 
    S s1; 
    // okay - implicit copy constructor 
    S s2(s1); 

    S s3; 
    // okay - implicit copy assignment 
    s3 = s1; 

    // awkward 
    if(s1 == s2) 
     cout << "can't be" << endl; 

    return 0; 
} 

このピースは予想通りにはコンパイルされません。このデザイン決定の年齢と(おそらく)それに依存するコードの量を考えると、私たちは永遠にそれに固執しています。それでも、誰もその背後にある最初の理由について勘違いをしていますか?C++で暗黙のビット単位の比較が行われないのはなぜですか?

+0

比較は値ベースの操作であり、ビット単位の操作ではないためです。 – Peter

+1

[this one](http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2016/p0432r0.html)のように、C++に* memberwise *の比較を追加する提案があります。将来の標準の一部となる可能性があります。 –

答えて

4

これは、初期化されていないため、任意の値を持つことができるパディングバイトのためです。例えば

次のようにSが定義されている場合、:

struct S { 
    char m_c; 
    int m_i; 
}; 

m_cm_i間、s1s2は、すべてのメンバーが同じ値であっても、等しくない比較することができパディングバイトが存在します。

もう1つの理由は、いくつかの型が同じ値に対して複数のオブジェクト表現を持つ可能性があるということです。

+0

これ以上の可能性はありません:コンパイラはmemcpy:upvotedを使ってデフォルトのコピーコンストラクタを実装することがよくあります。 – Bathsheba

+1

'memcpy'でコピーを作成しても問題ありません。パディングバイトは問題ではないのでコピーできます。 – alain

+0

これは、memcmpがデフォルトの比較のために行うべき正しいことではないが、C++でmemcpyがデフォルトのコピーに対して適切でない理由を説明するだけです。コンパイラは、メンバごとのコピーを保証する必要がありますこの場合はok)。したがって、質問は次のように読まれるべきです:なぜ、メンバーごとのデフォルトの比較がないのですか?そして、答えは:memcpy以外のmemcmpがPODで嗅ぎどころになっていないからです(人々は役に立つ言語機能を実装するのが怠惰です)... – BeyelerStudios

4

もしSがポインタを含んでいれば、Sの2つのインスタンスは同じ内容を持つかもしれませんが、ポインタは異なるメモリを指しているかもしれません(それらのメモリ位置のデータが同じであっても)。

あなたのスキームは完全な一般性では機能しません。

+1

これは 'Java'が輝く例です! – prakharsingh95

+2

それは理由ではありません - ポインタを比較することは別のビジネスです。 – alain

+0

ポインタを比較することは同じではなく、ポインタが指し示すメモリを比較するのと同じくらい有効です – BeyelerStudios

関連する問題