C ++标准和绑定功能

时间:2014-05-11 03:26:00

标签: c++ c++11 standards

在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),其中......

1 个答案:

答案 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>
  • 如果绑定了占位符对象,则会传入相应的调用站点参数
  • 否则,它传递绑定参数