2015-06-10 102 views
-1

以下是如何工作的?與右值引用的綁定函數

double doubleVal(double val) { 
    return val*2; 
} 

int main() 
{ 
    double myVal = 3.0; 
    double(*&&ptr)(double) = &doubleVal; // Why? 
} 

我不明白爲什麼函數地址可以被轉換爲右值引用..是不是一個左值?

回答

1

您的代碼基本上是問爲什麼:

using T = ...; 
T someVal; 

T*&& ref = &someVal; 

作品。雖然someVal是一個左值,&someValprvalue,它是一種右值。任何右值都可以用來初始化右值引用。

1

編譯器可識別的語法爲一個函數指針

double(*ptr)(double) = &doubleVal; 

附加&&抵抗PTR施加,而不是其PTR的函數的性質將指向

double(*&&ptr)(double) = &doubleVal; 

接受一個參考右值,而右邊的東西右值 - 它沒有名稱或地址,直到它存儲在ptr

return &(&doubleVal); // warning - returning address of temporary