右值对函数的引用

Leo*_*all 8 c++ rvalue-reference c++11

typedef void(&&RF)(void* p);

RF rf()
{
    return f;
}

int ay[10] = { 0 };

typedef int(&&RA)[10];

RA ra()
{
    return ay; // error
}

cout << is_lvalue_reference<decltype(rf())>::value << endl; // 1
Run Code Online (Sandbox Code Playgroud)

C++参考文献说"对函数的rvalue引用被视为左值,无论是否命名".

但我无法理解这是什么考虑因素?我想也许函数的名称总是左值.所以它必须保持左值的属性,并确保将函数名称传递给可以调用的任何地方,比如rf()(NULL).然后数组名称在我脑海中被禁止.我认为它也总是一个左值,所以我编写了上面的代码来测试它并得到一个错误.

谁能指出所有这一切背后的真正原因?

Bri*_*ian 9

在N3055中,简要讨论了函数的右值引用问题:

此外,rvalue引用(如传统的左值引用)可以绑定到函数.然而,将rvalue参考返回值作为rvalue处理,将函数rvalue的新概念引入到语言中.之前没有这样的想法 - 在右值上下文中使用的函数左值变为指向函数的rvalue,而不是函数rvalue - 因此当前的标准草案没有描述如何处理这样的右值.特别是,函数调用和函数指针的转换是根据函数左值来指定的,因此对函数的右值引用的最合理使用在当前的措辞中是未定义的.

函数没有生命周期或存储持续时间,因此左值/右值区别对它们没有意义.另一方面,如果允许函数rvalues存在,则必须解决引用段落中讨论的问题.鉴于此,强迫所有函数值为lvalues在我看来是一个合理的解决方案.

我认为另一种解决方案是完全禁止函数rvalues,因此任何创建函数类型的rvalue引用的尝试都会导致程序格式错误.我不知道这种方法是否被考虑过,但我的猜测是它会给通用编程带来不便.

另一方面,对于任何对象类型,包括数组类型,在左值和右值之间存在有意义的区别.因此,语言禁止您将对象类型的右值引用绑定到对象类型的左值.我不确定为什么你的代码无法编译会感到惊讶.