【发布时间】:2012-11-28 22:53:41
【问题描述】:
为什么以下代码中的嵌套std::bind 没有被任何主要编译器(VS2010/2012、gcc、clang)隐式转换为std::function<void()>?这是标准行为还是错误?
#include <functional>
void bar(int, std::function<void()>) { }
void foo() { }
int main()
{
std::function<void(int, std::function<void()>)> func;
func = std::bind(bar, 5, std::bind(foo));
std::cin.get();
return 0;
}
【问题讨论】:
-
因为嵌套的绑定表达式被急切地求值。实际上,您正在做类似于
std::bind(bar, 5, void)的事情,这是荒谬的。 -
这并不能回答问题,但这个:
func = std::bind(bar, 5,foo);按您的预期工作。 -
你想要达到什么目的?
bar可以直接分配给func,通过绑定参数,您正在创建一个可以在没有参数(或任何组合或参数)的情况下调用的函子。使用当前代码(假设已编译)func必须使用 int 和std::function<void()>调用,这两个参数都将被忽略,这将触发bar(5,foo)的执行... -
我意识到这个例子在功能上是错误的,但它显示了我所询问的编译器错误。
标签: c++ function templates c++11 bind