我使用Visual Studio 2017版本15.3.1测试了以下代码。
v.push_back(std::move(str1))可以正常工作。它将str1的内容移动到 vector 中。
str2是一个常量字符串。由于常量字符串创建后无法修改,因此我期望v.push_back(std::move(str2))语句将导致编译器警告。但是,令我惊讶的是,没有编译器警告。进入该程序后,我发现实际上调用了push_back(const T&)的重载。 std::move中的std::move(str2)似乎没有任何作用。

我的问题:尝试移动常量对象时是否应给出编译器警告?

// Compiled with Visual Studio 2017 version 15.3.1
std::vector<std::string> v;

std::string str1 = "string 1";
v.push_back(std::move(str1));
// Call push_back(T&&). The contents of str1 is moved into the vector.
// This is less expensive, but str1 is now valid but unspecified.

const std::string str2 = "string 2";
v.push_back(std::move(str2));
// Call push_back(const T&). A copy of str2 is added into the vector.
// str2 itself is unchanged.

最佳答案

不。请记住,std::move不会移动任何内容,它是通过remove_reference_t进行的荣耀转换。由于在您的情况下,它强制转换为const rvalue引用(因为std::remove_reference_t<const T>const T),因此它不会绑定(bind)到rvalue引用重载push_back(T&& ),而是绑定(bind)到const左值引用one-push_back(const T& )

关于c++ - 在没有编译器警告的情况下移动常量对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45804068/

10-13 08:39