我在這裏講述了一個長期的背景故事,因爲除了直接的答案之外,我想知道我的推理是否導致這種情況是正確的。爲什麼我需要在臨時dynamic_bitset上調用std :: move?
我有一個函數採取dynamic_bitset<>
參數(從Boost.dynamic_bitset)。 說它看起來像這樣。
void foo(boost::dynamic_bitset<> db) {
// do stuff
}
恰巧,它只會被調用與臨時工,從構造建成,爲foo(boost::dynamic_bitset<>{5}.set())
(含5位位集調用所有位設置)。
我的位集只有少量的位(少於32位)。所以起初,我認爲「我只是通過價值傳遞它;副本比指針小。」但後來我想:「它是動態的,所以它必須在堆上分配空間,我想避免不必要的分配和釋放。」
所以,我可以使它
void foo(const boost::dynamic_bitset<>& db);
但一提的是一個指針,一個來,dynamic_bitset(大概)有一個指向它的數據,所以後來用db
內foo
會經歷間接的兩個級別,這似乎愚蠢。很明顯,最好的方法是將指針複製到foo
,而不必在堆上重新分配和複製數據。
「啊哈!」我說。 「這當然是語義學的動力。」所以,我改變了簽名
void foo(boost::dynamic_bitset<>&& db);
但隨後,調用foo(boost::dynamic_bitset<>{5}.set())
給出了一個編譯器錯誤,cannot bind 'boost::dynamic_bitset<>' lvalue to 'boost::dynamic_bitset<>&&'
。 我必須改爲撥打 foo(std::move(boost::dynamic_bitset<>{5}.set()))
然後一切正常。
爲什麼我需要調用std :: move? 這似乎很明顯是一個xvalue(臨時即將到期),不是嗎?
這不取決於'set'是什麼? –