C++中的标准“map”容器允许您插入rvalue:
问题是当元素已经存在时会发生什么,即
显然,在上述情况下,答案是“是”,因为移动已经在创建对时发生。但现在假设我想更新现有值,但仍保留值是否已存在的信息(因此我不能只说
我在GCC中发现以下内容有效[更新:适用于GCC 4.6,不适用于GCC 4.8]:
但这个有保证不会移动吗?
T x;
std::map<int, T> m;
// m[1]; // populate "1"
auto it = m.insert(std::make_pair(1, std::move(x)));
问题是当元素已经存在时会发生什么,即
it->second == false
。元素x
是否已被“移动”?例如,如果它是一个唯一指针,x
是否已被重置为null?显然,在上述情况下,答案是“是”,因为移动已经在创建对时发生。但现在假设我想更新现有值,但仍保留值是否已存在的信息(因此我不能只说
m[1] = std::move(x);
)。在这种情况下,“不移动”对象是否可能?我在GCC中发现以下内容有效[更新:适用于GCC 4.6,不适用于GCC 4.8]:
auto it = m.insert(std::pair<const int, T &&>(1, std::move(x)));
但这个有保证不会移动吗?
find()
... :) - Nimlower_bound
函数。我知道这个函数。 - Kerrek SBm.emplace_back(1, std::move(x));
。 - Xeoemplace
而不是emplace_back
:-) - Kerrek SB