答案 0 :(得分:1)
问题似乎是std::bind
在内部传递Callable
(它实际上是std::bind<>
类型)对象{{1}的评估结果当你在这里第二次传递它时:
c
它没有像您假设的那样传递part2(std::bind(&Quux::part3<Callable>, this, 3, c))
对象的未评估版本。
因此,由于std::bind
函数返回f
类型,void
表达式的结果在内部作为c
类型传递,而不是未评估的可调用类型功能对象。因此,当您尝试调用void
中的Callable
对象c
时,Quux::part2
会反过来尝试评估c
中的来电Quux::part3
,但它无法通过可调用对象作为Quux::part3
的第二个参数,因为它传递的类型实际上是void
类型,而不是可调用类型。
如需进一步参考,请参阅此处:http://en.cppreference.com/w/cpp/utility/functional/bind
特别注意:
如果
std::is_bind_expression<T>::value==true
(即另一个std::bind()
子表达式在bind
的初始调用中用作参数),则会立即调用该bind-subexpression,并且其结果传递给函数。
如果您想延迟评估以便在需要时进行评估,而不是在传递std::bind
子表达式时,则必须寻找另一种方法,例如lambda,或者std::function<>
对象,仿函数或其他类对象类型,它们都可以调用,并且可以存储一个可以在以后评估的状态。