函数的右值引用

rvalue reference to function

本文关键字:引用 函数      更新时间:2023-10-16
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中简要讨论了函数的右值引用问题:

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

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

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

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