这个问题是关于 C++11 标准库中几个函数的规范,它们将它们的参数作为右值引用,但在所有情况下都不使用它们。一个例子是
std::unordered_set<T>::insert(T&&)
。
很明显,T
如果容器中的元素尚不存在,此方法将使用 的移动构造函数来构造该元素。但是,如果元素已经存在于容器中会怎样?我很确定没有理由更改案例中的对象。但是,我在 C++11 标准中没有找到任何支持我的主张的内容。
这里有一个例子来说明为什么这可能很有趣。以下代码从 std::cin 读取行并删除第一次出现的重复行。
std::unordered_set<std::string> seen;
std::string line;
while (getline(std::cin, line)) {
bool inserted = seen.insert(std::move(line)).second;
if (!inserted) {
/* Is it safe to use line here, i.e. can I assume that the
* insert operation hasn't changed the string object, because
* the string already exists, so there is no need to consume it. */
std::cout << line << '\n';
}
}
显然,这个例子适用于 GCC 4.7。但我不确定,如果按照标准是正确的。