将 const 限定对象传递给“std::move”

dig*_*evo 1 c++ static-code-analysis move-semantics pvs-studio

通过在PVS-Studio中进行一些代码分析,它给了我一些警告消息。

我在头文件中有以下语句:

constexpr int MIN_ALLOWED_Y { 0 };
Run Code Online (Sandbox Code Playgroud)

在源文件中:

std::make_pair<const int, const int>( std::move( MIN_ALLOWED_Y ), std::move( MAX_ALLOWED_Y ) )
Run Code Online (Sandbox Code Playgroud)

在上面的表达式中,我曾经std::move转换MIN_ALLOWED_Y为 xvalue,因为我认为std::make_pair只接受右值;

// from https://en.cppreference.com/w/cpp/utility/pair/make_pair

template< class T1, class T2 >
constexpr std::pair<V1,V2> make_pair( T1&& t, T2&& u );
Run Code Online (Sandbox Code Playgroud)

但我收到如下警告消息:

V833 Passing the const-qualified object 'MIN_ALLOWED_Y' to the 'std::move' function disables move semantics.
Run Code Online (Sandbox Code Playgroud)

这是有效的警告吗?如果是这样那我该怎么办?我应该删除std::move(也许在这种情况下它是多余的?)?

更好的问题是哪里不应该使用std::move

Joh*_*nck 5

你的代码:

std::make_pair<const int, const int>( std::move( MIN_ALLOWED_Y ), std::move( MAX_ALLOWED_Y ) )
Run Code Online (Sandbox Code Playgroud)

过于复杂。不仅move如 PVS Studio 告诉您的那样毫无意义,而且make_pair在显式指定类型时使用 s 也是毫无意义的。您可以简化为:

std::pair<const int, const int>( MIN_ALLOWED_Y, MAX_ALLOWED_Y )
Run Code Online (Sandbox Code Playgroud)

没有多余的仪式就可以做同样的事情。