对函数的右值引用
Posted
技术标签:
【中文标题】对函数的右值引用【英文标题】:rvalue reference to function 【发布时间】:2014-08-05 19:10:31 【问题描述】: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)
。然后阵列名称不由自主地出现在我的脑海中。我认为它也总是一个左值,所以我写了上面的代码来测试它并得到了一个错误。
谁能指出这一切背后的真正原因?
【问题讨论】:
任何命名的右值引用本身就是一个左值。 这很有趣。有一条语言规则规定,如果函数返回对函数类型的 rvalue 引用,则函数调用表达式是左值(偶数)。但这只是函数类型的例外,其他任何类型都不例外。 @chris 命名的右值引用是一个 xvalue。 【参考方案1】:在N3055 中简要讨论了对函数的右值引用问题:
此外,右值引用(如传统的左值引用)可以绑定到函数。治疗一个 右值引用返回值作为右值,然而,引入了函数右值的新概念 进入语言。以前没有这样的想法——在右值上下文中使用的函数 lvalue 变成一个指向函数右值的指针,而不是一个函数右值——所以当前的标准草案没有 描述如何处理这些右值。特别是函数调用和函数转换 指针是根据函数左值指定的,因此右值引用最合理的用法是 功能在当前措辞中未定义。
函数没有生命周期或存储持续时间,因此左值/右值的区别对它们没有意义。另一方面,如果允许函数右值存在,则必须解决引用段落中讨论的问题。鉴于此,在我看来,强制所有函数值为左值似乎是一个合理的解决方案。
我想,另一种解决方案是完全禁止函数右值,因此任何创建对函数类型的右值引用的尝试都会导致程序格式错误。我不知道是否考虑过这种方法,但我的猜测是它会给泛型编程带来不便。
另一方面,对于任何对象类型,包括数组类型,左值和右值之间都有一个有意义的区别。因此,该语言禁止您将对象类型的右值引用绑定到对象类型的左值。我不知道你为什么对你的代码没有编译感到惊讶。
【讨论】:
以上是关于对函数的右值引用的主要内容,如果未能解决你的问题,请参考以下文章