2013-07-13 34 views
3

在下面的示例代碼中,重載的運算符<不是const限定的,它在Visual C++(所有版本直到2013 Preview)下編譯,但是在Clang ,它會拋出一個錯誤 - 注意:候選函數不可行:'this'參數的類型爲'const Entry',但方法未標記爲const bool運算符<(常量條目&其他)。Visual C++關係運算符重載const正確性(使用std :: sort)

#include "stdafx.h" 
#include <vector> 
#include <algorithm> 

struct Entry 
{ 
    unsigned int age; 
    bool operator<(const Entry& other) // !!! no const qualification here !!! 
    { 
     return age < other.age; 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::vector<Entry> entries; 
    for(unsigned int i = 0; i < 100; ++i) 
    { 
     Entry entry; 
     entry.age = i; 
     entries.push_back(entry); 
    } 
    // Sort by age 
    std::sort(entries.begin(), entries.end()); 
    return 0; 
} 

是否Visual C++在執行比較/關係運算符的const正確性時不符合標準?或者這與std :: sort有關?

+3

可能是'std :: sort'實現問題:clang比較'const'上下文中的對象,而VC++不是。作爲一般規則,當clang和VC++不同意時,這是因爲VC++的實現有錯誤。 :) – Yakk

回答

3

C++標準規定,假設沒有非恆定函數將通過解除引用的迭代器被應用,首先通過在Compare算符可以傳遞到sort方面陳述它:

Compare是一個函數對象類型(20.8)。當上下文轉換爲bool(4)時,應用於類型爲Compare的對象 的函數調用操作的返回值在調用的第一個參數爲小於第二個參數的 時返回true,否則返回false。 Comparecomp在整個算法中用於假定 排序關係的算法。 假定comp不會通過取消引用的 迭代器應用任何非常量函數。

(重點煤礦)

,然後,通過陳述Compareoperator<之間的關係:

對於採用Compare所有的算法,存在使用operator<,而不是一個版本。即,comp(*i, *j) != false默認爲*i < *j != false。對於除了25.4.3中描述的算法以正確工作 以外的算法,comp必須對這些值產生嚴格的弱排序。

這兩個引號來自。從25.4分類和相關操作

所以,雖然沒有明確規定成員operator<必須是const,但它的意思是它必須是。限制comp而不是operator<是沒有意義的。

我會說Visual C++在這裏是錯誤的,因爲它允許在解除引用的迭代器上調用非const函數。