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 ) )

上記の式では、右辺値のみを受け入れると考えていたため、xvaluestd::moveにキャストしていました。MIN_ALLOWED_Ystd::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 ) )

複雑すぎる。movePVS Studio が言ったように s は無意味であるだけでなく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 に答える