提问人:Vinod 提问时间:9/17/2023 最后编辑:Jan SchultkeVinod 更新时间:9/17/2023 访问量:44
关于 std::lower_bound 中 comp 谓词的参数类型的问题
A question about the argument types to the comp predicate in std::lower_bound
问:
参考编号:std::lower_bound
摘录:
comp
- 二元谓词,如果第一个参数小于(即在第二个参数之前排序),则返回 true。谓词函数的签名应等效于以下内容:
bool pred(const Type1 &a, const Type2 &b);
虽然签名不需要有 ,但函数不得修改传递给它的对象,并且必须能够接受所有类型的值(可能)并且无论值类别如何(因此,不允许,除非移动等同于副本(自 C++11 以来)。
const &
const
Type1
Type2
Type1 &
Type1
Type1
我想在上面的摘录中澄清以下关于类型授权的内容:
除非移动等同于副本(从 C++11 开始)
Type1
Type1
我认为是不允许的,因为这可能会允许谓词修改传入的对象;但为什么不允许呢?这是否只是由于优化,从允许的前提条件中获取线索,如果移动等同于复制?或者还有更多吗?Type1&
Type1
Type1
答:
Type1&
是不允许的,因为如描述所述,该函数必须接受所有值类别的值。
非常量左值引用只能绑定到左值,而不能绑定到 xvalues 或 prvalues。
例如:
void take(int&);
void take_const(const int&);
void take_value(int);
int main() {
int x;
take(x); // OK, can accept lvalues
take(std::move(x)); // error, lvalue reference cannot bind to xvalues
take(0); // error, lvalue reference cannot bind to prvalues
take_const(x); // OK
take_const(std::move(x)); // OK
take_const(0); // OK, performs temporary materialization
take_value(x); // OK
take_value(std::move(x)); // OK, move is equivalent to copy for int
take_value(0); // OK
}
Type1
是允许的,因为它满足了要求;您可以将任何值类别传递给它。此外,如果将左值传递给它,则它会执行复制,这样可以很容易地确保它不会修改原始值。
但为什么不允许呢?难道只是因为优化,采取 来自前提条件的提示,如果移动是 等同于复制?或者还有更多吗?
Type1
Type1
这与使用非常量左值的原因相同,不允许修改原始值。迭代器(参见 std::move_iterator)可以返回一个右值引用,如果移动构造函数的操作与其复制构造函数不同,则该引用将被使用。Type1
这可能导致所有比较的元素最终为空。不好!:-)
下一个:C++ 生成文件问题
评论