在C ++标准(N3797)中,20.9.9.1.3有关于bind
的以下陈述。
返回:转发调用包装器
g
,其嵌套类型result_type
被定义为R
的同义词。g(u1, u2, ..., uM)
的效果应为INVOKE(fd, std::forward<V1>(v1), std::forward<V2>(v2), ..., std::forward<VN>(vN), R)
,其中绑定参数v1, v2, ..., vN
的值和类型如下所示确定。当且仅当FD
或任何类型TiD
的相应构造函数抛出异常时,转发调用包装器的复制构造函数和移动构造函数才会抛出异常。
但是在调用包装器中没有提到未绑定的参数u1 u2 ... uM
。我错过了什么吗?中间的陈述不应该如下所示?
......
g(u1, u2, ..., uM)
的效果应为INVOKE(fd, std::forward<V1>(v1), std::forward<V2>(v2), ..., std::forward<VN>(vN), std::forward<U1>(u1), ... std::forward<UM>(um), R)
,其中......
答案 0 :(得分:2)
...按以下规定确定:
绑定参数v1,v2,...,vN及其值的值 相应的类型V1,V2,...,VN取决于TiD衍生的类型 从调用bind和调用包装器的cv -qualifiers cv 如下:
- 如果TiD是reference_wrapper,则参数为tid.get(),其类型Vi为T&amp ;;
- 如果is_bind_expression :: value的值为true,则参数为 tid(std :: forward(uj)...)及其类型Vi是result_of :: type;
- 如果is_placeholder :: value的值j不为零,则参数为std :: forward(uj),其类型Vi为Uj&amp;&amp ;;
- 否则,该值为tid,其类型Vi为TiD cv&amp;。
换句话说:
std::bind
的另一个结果,或者std::is_bind_expression
计算为true的任何其他结果,它会将调用站点中的所有参数传递给它,并将结果传递给包装的函数对象< / LI>