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
的地方它是右值,它也是左值),为什么会被破坏?这里本身没有移动,只是传递参数!@VioletGiraffestd::move
(有时std::forward
)导致其参数被解释为右值,这可能导致在作为右值接收它的函数中发生过期。向前/移动帮助器函数生成一个特权,该特权可由例如test
执行。在这种情况下,test
始终使右值参数无效。好的,假设我只是想让它正常工作,所以我删除了std::forward
。我应该使用另一个包装吗?@VioletGiraffe不,这里唯一简单的解决方案就是删除forward
。