2010-01-30 32 views
33

§3.10第9節說「非等級rvalues總是具有cv-不合格類型」。這讓我不知道......非等級rvalues總是有cv-不合格類型

int foo() 
{ 
    return 5; 
} 

const int bar() 
{ 
    return 5; 
} 

void pass_int(int&& i) 
{ 
    std::cout << "rvalue\n"; 
} 

void pass_int(const int&& i) 
{ 
    std::cout << "const rvalue\n"; 
} 

int main() 
{ 
    pass_int(foo()); // prints "rvalue" 
    pass_int(bar()); // prints "const rvalue" 
} 

根據標準,有作爲非類類型一個const右值沒有這樣的事情,但bar()喜歡綁定到const int&&。這是一個編譯器錯誤?

編輯:顯然,this也是一個const右值:)

編輯:這個問題似乎是固定在G ++ 4.5.0,這兩條線打印「右值」了。

+0

哇,優秀的問題。我希望我能投票兩次。 – 2010-01-30 23:34:48

+0

如果我可以爲答案提供100點獎勵。 – Omnifarious 2010-01-31 00:05:06

+0

你正在使用哪種編譯器? g ++ 4.3.2抱怨不能用const變量重載pass_int函數。 – rajeshnair 2010-01-31 18:55:19

回答

11

委員會似乎已經意識到,有標準的這一部分的問題。 CWG issue 690談論與標準完全相同的部分(在2009年9月的「附加說明」中)有些類似的問題。我想很快就會爲這部分標準起草新的語言。

編輯:我剛剛在comp.std.C++上提交了一篇文章,注意到這個問題,併爲標準的相關部分提出了新的措辭。不幸的是,作爲一個主持人的新聞組,幾乎每個人都可能在通過覈准隊列時忘記了這個問題。

+0

只需稍後編輯新的信息,問題應該出現在* active *選項卡中。 – 2010-01-31 01:09:28

+0

那麼,該消息是否已被批准? – Omnifarious 2010-02-07 22:05:30

+0

郵件已被批准併發布,但是沒有人回覆/跟進(尚未?) – 2010-02-07 23:12:55

2

好點。我想有兩件事情看:1)正如你所指出的非類右值thingsy 2)如何重載解析的工作原理:

最佳 功能的選擇標準參數的個數, 的參數如何匹配候選 功能的 參數類型列表,[...]

我還沒有看到標準的東西,告訴我非階級的右值時被特殊處理重載分辨率。

你的問題是覆蓋在標準我雖然(N-4411)有所草案:但是

是什麼開始發揮作用,是一個參考並行讀取結合,隱式轉換序列,引用和超載在一般的分辨率:結合

13.3.3.1.4參考

2當引用類型 的參數不直接結合到一個參數 表達式,轉換序列 是根據 到13.3.3.1將參數表達式轉換爲參考的基礎 類型所需的轉換序列。

13.3.3.2排名的隱式轉換的序列

3的 相同的形式的兩個隱式轉換序列是除非的 以下規則之一適用難以區別 轉換序列:

- 標準轉換序列S1是更好的c反轉序列比 標準
轉換序列S2如果

-S1和S2是參考結合(8.5。3)和既不是指不具有REF-限定符中聲明的 非靜態 成員函數的 隱式對象參數,並且或者S1結合左值的 左值參考 和S2結合一個rvalue參考或S1結合一個rvalue 參考到一個右值並且S2 綁定一個左值引用。

[示例:

int i; 
int f(); 
int g(const int&); 
int g(const int&&); 
int j = g(i); // calls g(const int&) 
int k = g(f()); // calls g(const int&&)