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

Passing the const-qualified object to the 'std::move'

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

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

constexpr int MIN_ALLOWED_Y { 0 };

并且在源文件中:

std::make_pair<const int, const int>( std::move( MIN_ALLOWED_Y ), std::move( MAX_ALLOWED_Y ) )

在上面的表达式中,我使用 std::moveMIN_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 );

但我收到如下警告消息:

V833 Passing the const-qualified object 'MIN_ALLOWED_Y' to the 'std::move' function disables move semantics.

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

一个更好的问题是什么地方不能使用 std::move?

听起来你在某处写了 std::move(MIN_ALLOWED_Y) 并且你从静态分析器收到了关于它的警告。是的,我会删除 std::move,因为将常量移动到其他地方没有任何意义。

移动语义用于在 C++ 对象中移动,其中可能不可能或昂贵地复制对象中包含的 data/resources。在移动操作中作为数据源的对象可能会因移动而改变,但你的常量不可能改变。

您的代码:

std::make_pair<const int, const int>( std::move( MIN_ALLOWED_Y ), std::move( MAX_ALLOWED_Y ) )

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

std::pair<const int, const int>( MIN_ALLOWED_Y, MAX_ALLOWED_Y )

同样的事情没有多余的仪式。