将引用(右值)移动到函数

Posted

技术标签:

【中文标题】将引用(右值)移动到函数【英文标题】:Move reference (rvalue) to function 【发布时间】:2018-01-11 00:31:27 【问题描述】:

我正在阅读一些文档并看到了这个:

template<class Ret, class... Args>
struct is_function<Ret(Args...) &&> : std::true_type ;

引用自:http://en.cppreference.com/w/cpp/types/is_function

你怎么能有一个函数的右值引用?

据我了解,函数没有存储生命周期。有人可以解释一下吗?我理解引用和指针,但你怎么能“移动”一个函数?

我编写了这段代码,它可以按应有的方式编译和运行:

#include <iostream>
using namespace std;

int foo(int num) 
    return num + 1;


int main() 

    int (*bar1)(int) = &foo;
    cout << bar1(1) << endl;

    int (&bar2)(int) = foo;
    cout << bar2(2) << endl;

    auto bar3 = std::move(bar2); // ????
    cout << bar3(3) << endl;
    cout << bar2(2) << endl;

    int (&&bar4)(int) = foo; // ????
    cout << bar4(4) << endl;


让我们说一下您是否可以将函数作为字节码/操作码存储在内存中,然后“移动”它。 CPU不会阻止它运行吗?

编辑:@NicolBolas 纠正了我的误解,但这是我的另一个“问题”的答案:rvalue reference to function

【问题讨论】:

右值引用并不意味着“移动”。 Relevant @NicolBolas 我的意思是应用移动语义。它不会复制机器指令,而是“移动”它。 可以拥有对函数的右值引用,但Ret(Args...) &amp;&amp; 不是。拼写为Ret (&amp;&amp;)(Args...) 您既不能“复制”也不能“移动”机器指令。这些都与您的代码中发生的事情无关。您只是在“移动”一个函数指针。移动函数指针只是复制它(与所有基本类型相同)。 【参考方案1】:

你怎么能有一个函数的右值引用?

这不是那个意思。

Ret(Args...) &amp;&amp; 末尾的&amp;&amp; 指的是a member function to have an rvalue this 的能力。因此,该特化适用于以 Ret 作为返回值、Args 作为其参数并使用右值 this 的函数类型。

所以它不是“对函数的右值引用”。这是一个接受右值 this 的函数。

【讨论】:

这对我来说看起来并不完整——一个函数根本不需要this,它不是必须是一个声明为Ret(Class::*)(Args...) &amp;&amp;的指向方法的指针? 啊,我明白我缺少什么了 - Ret (Class::*)(Args...) &amp;&amp; 也可以写成 using F = Ret(Args...) &amp;&amp;; F Class::*

以上是关于将引用(右值)移动到函数的主要内容,如果未能解决你的问题,请参考以下文章

cpp►C++11右值引用移动语义移动构造函数移动赋值运算符

cpp►C++11右值引用移动语义移动构造函数移动赋值运算符

右值引用,移动语义,完美转发

重新理解C11的右值引用

❥关于C++之右值引用&移动语义┇移动构造&移动复制

C++11之右值引用:移动语义和完美转发(带你了解移动构造函数纯右值将亡值右值引用std::moveforward等新概念)