【发布时间】:2012-10-26 11:04:45
【问题描述】:
假设我有一个带有两个参数的函数,
void f(int x, int y);
我想绑定其中一个。我可以使用std::bind如下:
auto partiallyBoundF = std::bind(f, 10, _1);
partiallyBoundF 只接受一个参数,但我可以用多个参数调用它。第一个以外的参数甚至不必是任何有意义的类型:
partiallyBoundF(20, 0);
partiallyBoundF(0, 44, -99, "Hello", 4.5, true, []{});
允许从bind 返回的对象传递额外参数的目的是什么?它允许编译调用错误,而这些错误会在其他任何地方被拒绝。
【问题讨论】:
-
什么编译器?我猜这可能只是一个不符合标准的编译器(因为允许这些额外的参数真的没有意义,我怀疑标准是否允许这样做)。例如,MSVC 通过定义每个可变参数模板来模拟可变参数模板以获取最大可能的模板参数并将它们默认为某些 NIL 类型。也许类似的事情是你行为的原因?
-
@ChristianRau:这是标准的一部分。它也是 TR1 的一部分。 20.8.2/4 评论说,预期的实现是针对可变参数模板化的
operator()简单地接受传递给它的任何内容,而不管参数的类型或数量如何。 TR1 有类似的措辞。 -
在您的情况下,f(w1, ..., wN) where
N = sizeof...(bound_args)(绑定调用的参数数)应为有效表达式,请参见 20.8.9.1.2/2 和 20.8 .2/1。编辑:它不允许任何其他方式调用它。 -
@KnowItAllWannabe 它允许采用“任意参数列表”,但“将参数传递给包装的可调用对象”。我认为这是否允许这种调用是有争议的(毕竟
f(int, double, whatever)是无效的)。 -
@ChristianRau:带有 11 月 CTP 的 MSVC11 毫无怨言地接受了额外的参数。