2016-11-12 18 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

有人建議將* memberwise *比較添加到C++中,如[this one](http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2016/p0432r0.html)。可能成爲未來標準的一部分。 –

回答

4

這是因爲填充字節,它沒有初始化,因此可以有任何值。

例如,如果S定義如下:

struct S { 
    char m_c; 
    int m_i; 
}; 

m_i之間m_c,存在填充字節這可能使s1s2比較不等,即使所有成員都具有相同的值。

另一個原因是某些類型可能具有相同值的多個對象表示。

+0

沒有更合理的了:編譯器通常會使用memcpy實現默認的拷貝構造函數:upvoted。 – Bathsheba

+1

使用'memcpy'複製是沒有問題的,填充字節可以被複制,因爲它們無關緊要。 – alain

+0

這隻解釋了爲什麼memcmp不適合默認比較,但在C++中,memcpy對於缺省副本不是正確的:編譯器必須確保逐個成員的副本(對於POD memcpy是好的在這種情況下)。所以這個問題應該被理解爲:爲什麼沒有默認的逐個成員的比較?答案可能是:因爲除了memcpy之外,memcmp不能滿足PODs的要求(並且人們懶惰地實現了有用的語言特性)...... – BeyelerStudios

4

如果S表示包含指針,那麼S的兩個實例可能具有相同的內容,但是它們的指針可能指向不同的內存(即使這些內存位置上的數據是相同的)。

因此,您的計劃將不能完全通用。

+1

這是一個'Java'閃耀的例子! – prakharsingh95

+2

這不是原因 - 比較指針是另一項業務。 – alain

+0

比較指針並不相同,但與指針指向的內存的比較是一樣的 – BeyelerStudios

相關問題