【问题标题】:Why does std::not1() take parameter by const reference instead of by value?为什么 std::not1() 通过 const 引用而不是按值获取参数?
【发布时间】:2016-02-22 08:07:46
【问题描述】:

std::not1()的原型如下:

template< class Predicate >
std::unary_negate<Predicate> not1(const Predicate& pred);

这有效地禁止了移动语义。为什么不将其原型化为:

template< class Predicate >
std::unary_negate<Predicate> not1(Predicate pred);

这样,复制或移动取决于pred 的构造方式。然后该函数只是将pred 移动到构造的std::unary_negate 对象。

【问题讨论】:

  • 他们可以为右值添加额外的重载,但是当你有 lambdas 时,没有人真正关心那些非泛型帮助器。很快他们就会被通用引用所取代,无论如何都接受not_fn
  • @hvd 刚刚删除 constexpr 并回退到 C++03。
  • @Lingxi 这对我来说似乎很合理,谢谢。
  • @Revolver_Ocelot 到目前为止,使用 std::not1() 的语法比使用 lambda 更简单。
  • @Lingxi 不是;您需要将所有 result_type/argument_type 样板类型定义放入类型中,并对函数/成员指针进行额外的包装调用。

标签: c++ language-lawyer c++-standard-library


【解决方案1】:

自己做出改变是完全没有用的。 not1 所做的是使用pred 作为构造函数的参数来构造std::unary_negate&lt;Predicate&gt;。但是std::unary_negate&lt;Predicate&gt; 的唯一相关构造函数采用const Predicate &amp;不是 Predicate &amp;&amp;

逻辑上的后续问题是,为什么std::unary_negate&lt;Predicate&gt; 没有一个构造函数采用Predicate &amp;&amp;?它在设计时显然不能接受这样的论点,因为右值引用还不存在。至于以后,这有点猜测,但我想说 lambdas 已经很好地满足了需求,所以 unary_negate 除了向后兼容性之外没有什么意义了。

【讨论】:

  • 听起来很合理。尽管如此,我还是更喜欢 std::not1() 而不是 lambda,因为它的语法更简单,更直观和可读。
  • @Lingxi 如果标准库是从零开始设计的,我想std::not1 可能会被定义为返回一个未指定的返回类型,这样就可以通过返回一个 lambda 来实现。 :) 不幸的是,现在进行更改也会破坏向后兼容性。
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
相关资源
最近更新 更多