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++引用说:“对函数的右值引用是否被视为左值
是否命名”。
但是我不明白这是什么考虑因素?我想也许函数的名称总是一个左值。因此,它必须保留其左值的属性,并确保将函数名称传递到可以调用的任何位置,例如
rf()(NULL)
。然后,我想到了数组名称。我认为它也始终是左值,因此我编写了上面的代码以对其进行测试并出现错误。谁能指出所有这些背后的真正原因?
最佳答案
在N3055中,简要讨论了对函数的右值引用的问题:
函数没有生存期或存储期限,因此左值/右值区分对它们没有意义。另一方面,如果允许存在函数右值,则必须解决引用的段落中讨论的问题。鉴于此,在我看来,将所有函数值都强制为左值是一种合理的解决方案。
我想,另一种解决方法是完全禁止函数右值,因此任何尝试创建对函数类型的右值引用都会导致程序格式错误。我不知道是否考虑过这种方法,但是我的猜测是,这将给通用编程带来不便。
另一方面,对于任何对象类型,包括数组类型,左值和右值之间都有有意义的区别。因此,该语言禁止您将对象类型的右值引用绑定(bind)到对象类型的左值。我不确定为什么您的代码没有被编译感到惊讶。
关于c++ - 对函数的右值引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25146508/