C++11 通过std::forward传递时,右值引用参数过期?

C++11 通过std::forward传递时,右值引用参数过期?,c++11,rvalue-reference,C++11,Rvalue Reference,我有这段代码,它试图通过中间类将模板参数包完美地转发到std::function: #include <functional> #include <vector> #include <algorithm> #include <iterator> #include <memory> #include <iostream> template <typename ...Arguments> class CSignal

我有这段代码,它试图通过中间类将模板参数包完美地转发到
std::function

#include <functional>
#include <vector>
#include <algorithm>
#include <iterator>
#include <memory>
#include <iostream>

template <typename ...Arguments>
class CSignal
{
public:
    typedef std::function<void (Arguments...)> SignalFunction;
public:
    void connect(const SignalFunction& target)
    {
        m_connections.emplace_back(std::make_shared<SignalFunction>(target));
    }

    template <typename ...ActualArguments>
    void invoke(ActualArguments&&... args) const
    {
        for (auto& connection: m_connections)
            if (connection)
                (*connection)(std::forward<ActualArguments>(args)...);
    }

private:
    std::vector<std::shared_ptr<SignalFunction>> m_connections;
};


struct A
{
    void f() {std::cout << __FUNCTION__ << "\n";}
};

void test(std::shared_ptr<A> ptr)
{
    if (ptr)
        ptr->f();
}

int main()
{
    CSignal<std::shared_ptr<A>> signal;
    signal.connect(test);
    signal.connect(test);

    signal.invoke(std::make_shared<A>());

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
模板
类CSignal
{
公众:
typedef std::函数信号函数;
公众:
无效连接(常量信号功能和目标)
{
m_connections.emplace_back(std::make_shared(target));
}
模板
无效调用(ActualArguments&…args)常量
{
用于(自动连接:m_连接(&U)
如果(连接)
(*连接)(标准::转发(args)…);
}
私人:
std::向量m_连接;
};
结构A
{

void f(){std::coutYes;
std::forward
ActualGuments
不是引用类型时执行与
std::move
相同的操作

就过期而言,
向前
需要与
移动
一样对待。通常,在循环中,您不
向前
移动


如果你想在最后一个循环迭代中移动这个参数,你必须把它从循环中分解出来。这可能意味着不使用语法的范围。但是,你可能会问这是否是一个有价值的优化,并且考虑在更多的性能数据可用时保存它。nswer?我的理解是,

std::move
所做的只是将其参数作为右值引用返回,从而丢失参数的名称以使其成为右值。但是原始的
args
参数仍然存在于外部范围中(即使在调用
invoke
的地方它是右值,它也是左值),为什么会被破坏?这里本身没有移动,只是传递参数!@VioletGiraffe
std::move
(有时
std::forward
)导致其参数被解释为右值,这可能导致在作为右值接收它的函数中发生过期。向前/移动帮助器函数生成一个特权,该特权可由例如
test
执行。在这种情况下,
test
始终使右值参数无效。好的,假设我只是想让它正常工作,所以我删除了
std::forward
。我应该使用另一个包装吗?@VioletGiraffe不,这里唯一简单的解决方案就是删除
forward