右值引用可以绑定到函数吗?
Can an rvalue reference bind to a function?
我用GCC, Clang, ICC和VS测试了以下代码:
void f() {}
void g(void (&&)()) { }
int main() {
g(f);
}
我们可以看到,g
是一个右值引用,而f
是一个左值引用,通常,右值引用不能绑定到左值。这正是ICC抱怨的原因:
error: an rvalue reference cannot be bound to an lvalue
VS也给出了一个错误,但原因是:
error C2664: 'void h(void (__cdecl &&)(void))' : cannot convert parameter 1 from 'void (__cdecl *)(void)' to 'void (__cdecl &&)(void)'
对我来说,这表明VS立即执行函数到指针的转换,而不是直接将引用绑定到f
。值得一提的是,如果我将g(f)
替换为g(&f)
,那么这四个编译器会产生相同的错误。
对类型"cv1 T1"的引用由类型"cv2 T2"的表达式初始化为
-如果引用是左值引用[…]
-否则,[…]引用必须是右值引用。
-如果初始化表达式是[…][…]
则引用绑定到初始化表达式[…]
我的解释是正确的(也就是说,Clang和GCC是兼容的给定原因)?
我的解释正确吗?
是的。
你的解释是正确的,因为你引用了标准的段落。进一步的确认来自第13.3.3.1.4/3段关于引用绑定:
除了隐式对象形参(见13.3.1)外,标准转换序列不能为如果需要绑定左值引用而不是对非易失性const类型的引用,则形成右值或将右值引用绑定到左值而不是函数lvalue。[…]
13.3.3.3/3段包含进一步(间接)确认:
[…如果
,则标准转换序列S1优于标准转换序列S2。— [...]
—S1和S2是引用绑定(8.5.3),S1将左值引用绑定到函数lvalue, S2将右值引用绑定到函数lvalue。(例子:
int f(void(&)()); // #1 int f(void(&&)()); // #2 void g(); int i1 = f(g); // calls #1
- 结束示例]
相关文章:
- 将自由函数绑定为类成员函数
- 有没有办法将重载的类函数绑定到函数对象?
- 如何将类 1 的 std::函数绑定到类 2 的函数?
- 如何将 STL 队列推送函数绑定到 std::函数?
- 如何在 C# 中将带有参数的函数绑定到包中
- 如何仅使用 c/python API 将 c++ 成员函数绑定到 python?
- 将非静态函数绑定到回调时出现问题
- 意外输出..函数绑定在虚拟表中的发生方式
- 将类实例函数绑定到 v8::FunctionTemplate
- 是否可以将匿名 lambda 函数绑定到对象以允许 lambda 中的代码访问对象的成员?
- 使用JNI将C 类成员函数绑定到Java
- 将静态成员函数绑定为回调
- 如何使用 boost::bind 将静态成员函数绑定到 boost::function
- 如何将C++函数绑定到xaml文本块属性
- boost::使用成员函数绑定回调的帮助
- 如何将成员函数绑定到 C++14 中的对象
- std::函数绑定到成员函数
- 将带有unique_ptr参数的函数绑定到 std::function<void()>
- 将常规函数绑定到 std::function
- std::将成员函数绑定到 nullptr 处的实例,导致看似随机的 this 指针