1

通过在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::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 );

但我收到警告消息,例如:

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

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

一个更好的问题是在哪里不使用std::move

4

2 回答 2

5

你的代码:

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

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

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

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

于 2021-12-19T07:08:11.373 回答
3

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

移动语义用于在 C++ 对象周围移动,在这些对象中复制对象中包含的数据/资源可能是不可能或代价高昂的。作为移动操作中数据源的对象可能会被移动改变,但你的常量不可能改变。

于 2021-12-19T07:03:11.137 回答