函数的右值引用
rvalue reference to function
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中简要讨论了函数的右值引用问题:
此外,右值引用(与传统的左值引用一样)可以绑定到函数。对待一个然而,右值引用返回值作为右值,引入了函数右值的新概念融入语言。以前没有这样的想法——在右值上下文中使用左值函数变成了指向函数右值的指针,而不是函数右值——所以当前的标准草案没有描述如何处理这些右值。特别是函数调用和函数转换指针是根据函数的左值来指定的,所以右值引用的最合理的用法是函数在当前的措辞中是未定义的。
函数没有生命周期或存储持续时间,所以左值/右值的区别对它们来说没有意义。另一方面,如果允许函数右值存在,则必须解决引用段中讨论的问题。鉴于此,在我看来,强制所有函数值为左值似乎是一个合理的解决方案。
我认为,另一种解决方案是完全禁止函数的右值,因此任何创建函数类型的右值引用的尝试都将导致程序格式错误。我不知道这种方法是否被考虑过,但我的猜测是它会给泛型编程带来不便。
另一方面,对于任何对象类型,包括数组类型,左值和右值之间存在有意义的区别。因此,该语言禁止将对象类型的右值引用绑定到对象类型的左值。我不知道为什么你对你的代码不能编译感到惊讶
相关文章:
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 无法将右值引用函数与 GCC 匹配
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- 通过引用函数传递指针参数是什么意思?
- 常量引用函数参数的地址何时唯一?
- 我想了解为什么在这个例子中使用引用函数?或者引用在c++函数中的重要性
- C++ 通过引用函数传递数组,但内容保持不变
- 用数组或指针引用函数?
- 引用函数如何"int &foo();"工作?
- 常量引用函数参数:是否可以禁止临时对象?
- 计算在代码中引用函数的次数
- <initializer_list> 引用函数
- 字符串引用(函数)的差异
- 在类中引用函数时的"No Matching Function for Call"
- 无法通过引用函数"calcValues"中"firstNum"和"secondNum"变量来更改值
- 尝试引用已删除的函数(不引用函数)
- 引用函数指针
- 引用函数按值和自动返回
- 为什么我们可以取消引用函数指针
- 通过引用函数传递值的目的是什么