通過在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?
uj5u.com熱心網友回復:
您的代碼:
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 )
它在沒有多余儀式的情況下做同樣的事情。
uj5u.com熱心網友回復:
聽起來您好像在std::move(MIN_ALLOWED_Y)某處寫過,然后從靜態分析器那里收到了警告。是的,我會洗掉 ,std::move因為將常量移動到其他地方沒有任何意義。
移動語意用于在 C 物件中移動,復制物件中包含的資料/資源可能是不可能的或代價高昂的。在移動操作中作為資料源的物件可能會被移動更改,但您的常量不可能更改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/386146.html
標籤:C 移动语义 静态代码分析 pvs-studio
