以下如何运作?
double doubleVal(double val) {
return val*2;
}
int main()
{
double myVal = 3.0;
double(*&&ptr)(double) = &doubleVal; // Why?
}
我不明白为什么函数地址可以转换为右值参考..是不是左值?
答案 0 :(得分:1)
编译器将语法识别为函数指针
double(*ptr)(double) = &doubleVal;
对ptr应用额外的&&
,而不是ptr指向的函数的属性
double(*&&ptr)(double) = &doubleVal;
接受对右值的引用,右侧的东西是一个右值 - 在存储之前它没有名称或地址在ptr
。
return &(&doubleVal); // warning - returning address of temporary
答案 1 :(得分:1)
您的代码基本上是在问为什么:
using T = ...;
T someVal;
T*&& ref = &someVal;
的工作原理。虽然someVal
是左值,但&someVal
是prvalue,这是一种左值。任何右值都可用于初始化右值参考。