2017-06-06 28 views
5

注意:這個問題不是關於總訂單。使用std::less可獲得相同類型指針上的總訂單。運算符<(小於)指針是否一致?

According to this,比較指向operator<的兩個指針是不允許的,例如,如果它們指向不同的分配。

在哪種意義上不允許?它是實現定義的,未指定的還是未定義的行爲?

我想我讀的地方,它沒有說明。實現不需要記錄行爲是什麼,但必須有一些行爲。所以這意味着,比較任何兩個指針仍然合法,但不一定會產生全部訂單。 這是否意味着,當比較相同的兩個指針兩次時,我們仍然必須得到一致的結果?一般情況是:在應用程序中兩次調用相同的未指定行爲總是會得到相同的結果?

int i1, i2; 
int* a = &i1; 
int* b = &i2; 
bool b1 = a < b; // unspecified, right? 
bool b2 = a < b; 
assert(b1 == b2); // Is this guaranteed to be true? 

回答

4

比較兩個不相關的指針(即指針未指向同一存儲器,或不指向相同的「陣列」的不同部分)只能使用相等==和不等式!=來完成。所有其他比較是未指定

如果你有兩個指針指向同一個地方,或者在同一個數組中,那麼你可以使用相對運算符來比較它們。

所以,如果你有例如

int* p1 = new int[10]; 
int* p2 = new int[5]; 

可以使用==!=比較指針p1p2

但如果你有

int a = new int[10]; 
int* p1 = &a[0]; 
int* p2 = &a[3]; 

那麼你也可以使用<>(當然<=>=的)比較p1p2

+0

你有沒有具體的參照,指出這是* *未定義,?通過閱讀* [expr.rel] *,我知道它是*未指定*。 – Holt

+0

[這裏](http://eel.is/c++draft/expr。rel#3)它在第三點說,_否則,兩個指針都不會比另一個大。這不完全是一個UB。我錯了嗎? – skypjack

+2

從鏈接的SO回答 - 「但是,您可以使用std :: less和其他關係比較函數對象來比較任何兩個指針,結果是實現定義的,但是可以保證有一個總的排序。 –

-1

比較指針如你的榜樣意義不大因爲「a」和「b」值取決於數據如何存儲在內存中,而不是存儲在該位置的內容。

指針是內存中的地址(通常存儲爲32位整數)。除非您更改其中的任何一項,否則他們的比較將返回相同的結果。你可能不知道結果是什麼,但你會知道每次都是一樣的。

因此,在你的情況下,你會得到相同的結果爲b1和b2,所以斷言將通過。

下面是一個例子,其中比較指針有一定道理:

int data[1000]; 
int *end = data + 50; 
for (int *c = data; c < end; c++) 
    ... use *c 
+0

*「a」和「b」值取決於數據如何存儲在內存中*實際上這通常是真實的,但行爲實際上是* undefined *。以問題爲例,編譯器可以選擇簡單地優化所有代碼。在這種情況下,內存根本不起作用。 –

+0

對我來說,這是不確定的,你無法預測結果。我的觀點是,雖然結果是不可預測的,但它是一致的。 – user3429660

+2

在C++中,術語*未定義行爲*具有[嚴格意義](http://en.cppreference.com/w/cpp/language/ub)。這意味着你無法理性地預測任何展現*未定義行爲的行爲*。編譯器可能會檢測到示例中的所有變量都未初始化。它可能會假定'* undefined * == * undefined *'的結果是最適合它的優化。你不能假設'b1 == b2'是'true'。編輯:這個問題自編寫此評論以來進行了編輯。 –