2013-07-08 50 views
6
struct CCompare 
{ 
    const bool operator()(const int& lhs, const int& rhs) const { 
     return lhs < rhs; 
    } 
}; 

警告1個警告C4180:限定符應用於函數類型沒有 含義;返回的`常量bool`導致警告C4180

我看到返回值的用法const bool在編程的書。當我使用vs2010編譯上述代碼時,它會報告警告C4180。

下面的代碼,而不是將不會導致同樣的警告。

struct CCompare 
{ 
    bool operator()(const int& lhs, const int& rhs) const { 
     return lhs < rhs; 
    } 
}; 

問題1>這是真的,的const Fundamental_Data_Types作爲一個功能的使用返回值沒有意義?

Question2>確實如果Type是類/結構,const Type作爲函數返回值的使用纔有意義?

謝謝

// //更新

struct CClass 
{ 
    int val; 
    CClass(int _val) : val(_val) {} 

    void SetValue(int _val) { 
     val = _val; 
    } 
}; 

struct CCompare 
{ 
    const CClass getMe() const { 
     return CClass(10); 
    } 

    CClass getMeB() const { 
     return CClass(10); 
    } 
}; 

int main(/*int argc, char *argv[]*/) 
{ 
    CCompare c; 

    c.getMe().SetValue(20); // error 
    c.getMeB().SetValue(20); // ok 
} 
+4

在這兩種情況下,返回值都被複制到調用者。你沒有權利對他們回來的複製值執行'const'。 – chris

+4

只有返回引用或指針時,'const'纔有意義,無論它是類/結構還是基本類型。 –

+0

vc2012無警告。 – Jichao

回答

7

是的是雙方的你的問題。返回值爲 右值,而cv-限定符只有在右值類型爲 時才適用於右值。

這樣做的原因很簡單:通常沒有什麼 您可以用右值,其中常量性將使 差異—這是一個值,畢竟,而不是一個對象做。 對於類類型,有成員函數可以使用 帳戶(這意味着您可以從右值中獲得左值),因此常量會突然變得相關。

+0

你能詳細說明爲什麼cv-qualifiers只適用於rvalues嗎? 'const int leftValue = 10'。這裏'const'被應用於一個左值。我認爲我誤解了你的觀點。 – q0987

+0

@ q0987你在誤讀我。 'const'可以應用於所有的左值。它只能適用於rvalues,如果他們有類的類型。 –