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
C ++参考说&#34;对函数的右值引用是否被视为左值 是否命名&#34;。
但我无法理解这是什么考虑因素?我想也许函数的名称总是左值。因此,它必须保留左值的属性并确保将函数名称传递给可以调用的任何位置,例如rf()(NULL)
。然后数组名称在我脑海中被禁止。我认为它也总是一个左值,所以我编写了上面的代码来测试它并得到一个错误。
谁能指出所有这一切背后的真正原因?
答案 0 :(得分:8)
在N3055中简要讨论了函数的右值引用问题:
此外,rvalue引用(如传统的左值引用)可以绑定到函数。治疗一个 然而,rvalue引用返回值作为rvalue引入了函数rvalue的新概念 进入语言。之前没有这样的想法 - 在右值上下文中使用的函数左值 变为指向函数的rvalue,而不是函数rvalue - 所以当前的标准草案没有 描述如何处理这样的rvalues。特别是函数调用和转换功能 指针是根据函数左值来指定的,因此最合理的使用rvalue引用 在当前的措辞中,函数是未定义的。
函数没有生命周期或存储持续时间,因此左值/右值区别对它们没有意义。另一方面,如果允许函数rvalues存在,则必须解决引用段落中讨论的问题。鉴于此,强迫所有函数值为左值似乎是一个合理的解决方案。
我认为另一种解决方案是完全禁止函数rvalues,因此任何尝试创建函数类型的rvalue引用都会导致程序格式错误。我不知道是否考虑过这种方法,但我的猜测是它会给通用编程带来不便。
另一方面,对于任何对象类型,包括数组类型,lvalues和rvalues之间存在有意义的区别。因此,语言禁止您将对象类型的右值引用绑定到对象类型的左值。我不确定为什么你的代码无法编译会感到惊讶。