【发布时间】:2017-07-01 13:44:43
【问题描述】:
我正在使用 VS2015,我在玩 std::function 和 std::bind 我发现了一个奇怪的错误。
我有一个 2 链式绑定操作:
int main()
{
auto func1 = [](int i) -> int {
return i + 1;
};
auto func2 = [](float f, function<int(int)>&& func) -> float {
return f + func(f);
};
auto func2_instance = std::bind(func2, std::placeholders::_1, func1);
cout << func2_instance(0.2) << endl;
auto func3 = [](double d, function<float(float)>&& func)->double {
return d + func(d);
};
//doesn't work
auto func3_instance = std::bind(func3, std::placeholders::_1, std::move(func2_instance));
//works
auto func3_instance = std::bind(func3, std::placeholders::_1, [funcmv = std::move(func2_instance)](float a)->float{
return funcmv(a);
});
func3_instance(0.2);
}
我得到的错误与func3_instance(0.2) 行有关
D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\type_traits(1468): error C2893: Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'
你能帮忙吗?我想念与std::bind 相关的内容?
提前致谢。
【问题讨论】:
-
也许您尝试将
std::bind更改为某个 lambda 表达式?请...使用std:: -
嵌套绑定表达式被急切求值;请参阅
std::is_bind_expression和boost::protect了解详情。 -
@21koizyd 我不明白你的意思!
-
@ildjarn 我尝试 ` namespace std { template struct is_bind_expression
: public true_type {}; }` 同样的错误。我认为问题来自 func3_instance调用。好像找不到合适的功能。 -
bind的参数是另一个bind调用的行为有点违反直觉。func3_instance(x)并不意味着func3(x, func2_instance)- 它意味着func3(x, func2_instance(x))。一种思考方式是嵌套的bind表达式与外部bind共享占位符,并且它们同时被替换。在您的示例中,您实际上有bind(func3, _1, bind(func2, _1, func1))-_1的两个实例同时被替换,它们不是独立的。
标签: c++11 c++14 std-function stdbind