2016-10-04 54 views
2

有沒有辦法將一個常量引用指定爲不綁定臨時對象的參數類型(函數的)? 也就是說,是否有一種標準的方式來指定引用是const,但它只能綁定到非臨時值,試圖綁定到臨時導致編譯器錯誤¹?指定一個不會綁定臨時對象的const int&`


例如,在一類X的構造的情況下,

class X 
{ 
public: 
    X(const int &value) 
     : mValue(value) 
    {} 

private: 
    const int &mValue; 
}; 

這將是一個很好的方法,以確保

class Y 
{ 
public: 

    /* ... */ 

    X* GetXForValue() const 
    { 
     return new X(mValue); 
    } 

private: 
    int mValue; 
}; 

編譯,但與所謂的一個臨時的,例如X x(100);,它不?


¹)我可以重載函數int&&並沒有定義它,但會給出錯誤的想法,只會導致鏈接錯誤。

+3

你可以'X(const int && value)= delete;'而不是定義導致鏈接器錯誤的函數 –

+0

@PiotrSkotnicki我認爲只有默認構造函數可以被標記爲已刪除? – MicroVirus

+0

@MicroVirus *任何*功能都可以標記爲已刪除。 – Rakete1111

回答

9

的一般解決方案是添加已刪除過載:

void foo(const int&); 

void foo(const int&&) = delete; 

後者對於右值更好的匹配,從而不希望的程序將選擇刪除過載,成爲形成不良。

+2

它是否必須是'const'在const int &&中?這是沒有必要的,對吧? – Rakete1111

+2

@ Rakete1111:呃。這取決於。對於內置類型,如果你只*想禁止prvalues,那麼你不需要限定,因爲內置的prvalues永遠不合格。但用戶定義的類型可能是合格的,並且OP也要求rvalues,而不是prvalues,並且xvalues當然可以被限定。 –

+5

Builtin * xvalues *可以被限定,所以如果你想禁止rvalues,那麼即使對於int也是很重要的。 –

相關問題