C++ std::reference_包装器不能很好地与std::bind一起工作

C++ std::reference_包装器不能很好地与std::bind一起工作,c++,c++11,C++,C++11,我试图用std::bind在C++11lambdas中模拟完美/移动捕获。在下面的函数中,我希望通过左值或右值传递带有可变“operator()”的处理程序,根据需要复制或移动它并调用它 template <typename Handler> void foo (Handler&& h) { std::bind ( [] (Handler& h) { h (); }, std::forward<Handler>

我试图用std::bind在C++11lambdas中模拟完美/移动捕获。在下面的函数中,我希望通过左值或右值传递带有可变“operator()”的处理程序,根据需要复制或移动它并调用它

template <typename Handler>
void foo (Handler&& h)
{
    std::bind (
        [] (Handler& h) { h (); },
        std::forward<Handler> (h)
    ) ();
}
模板
void foo(处理程序(&h)
{
绑定(
[](Handler&h){h();},
标准:正向(h)
) ();
}
这段代码在大多数情况下运行良好,但在使用std::ref包装处理程序时失败。

int main()
{
int i=0;
自动x=[i]()可变{std::cout decltype(t(std::forward(args)…)
{
返回t(标准:正向(参数)…);
}
};
模板内联my_reference_包装器
my_ref(T&T){return{T};}
int main()
{
int i=0;

auto x=[i]()可变{std::cout
std::bind
reference\u包装有特殊处理

您可以添加重载来处理:

template <typename T>
void foo (std::reference_wrapper<T> h)
{
    std::bind ([] (T& t) { t(); }, h) ();
}
模板
void foo(std::reference_包装器h)
{
绑定([](T&T){T();},h)();
}

template <typename T>
struct my_reference_wrapper
{
    T& t;
    template <typename ...As> auto
    operator() (As&&... args) const -> decltype (t (std::forward<As> (args)...))
    {
        return t (std::forward<As> (args)...);
    }
};

template <typename T> inline my_reference_wrapper<T>
my_ref (T& t) { return { t }; }

int main ()
{
    int i = 0;
    auto x = [i] () mutable { std::cout << "i=" << ++i << "\n"; };

    foo (my_ref (x));     // Now OK
    foo (my_ref (x));     // And even increments 'i' properly.
    return 0;
}
template <typename T>
void foo (std::reference_wrapper<T> h)
{
    std::bind ([] (T& t) { t(); }, h) ();
}