【发布时间】: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