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?
你的代码:
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)
没有多余的仪式就可以做同样的事情。