struct Person
{
int mId;
std::string mName;
Person(int id, std::string name) : mId(id), mName(std::move(name))
{
}
};
struct Node
{
Person mData;
Node* mLeft;
Node* mRight;
Node(Person data) : mData(std::move(data)), mLeft(nullptr), mRight(nullptr)
{}
};
在為我的 Person 類撰寫建構式時,我最初將我的 'name' 引數定義為 const 參考,但建議將其更改為簡單值并使用 std move。
我理解這是因為右值字串可用于初始化“Person”,在這種情況下,該字串將被移動到變數“name”中,而不是被復制。然后它將通過 std::move 進一步移動到成員變數“mName”中。我也覺得這只適用于 std::string 因為它定義了一個移動建構式。
我不明白為什么建議我在“Node”類建構式中再次使用 std::move,因為我沒有為 Person 定義移動建構式。此外,我注意到從 Person 類中洗掉字串成員變數 mName 會停止此 IDE 推薦。
我的猜測是這是因為 Person 類的默認移動建構式。
(如果有幫助,我的 IDE 是 VS2022,推薦來自擴展 Resharper')
uj5u.com熱心網友回復:
您的Person課程遵循“零規則”,這意味著它沒有明確宣告任何復制/移動操作或解構式。
這通常是正確的做法,因為編譯器將隱式宣告所有這些,并使用您通常期望從這些操作中獲得的語??義來定義它們(如果可能的話)。
Person在您的情況下,可以移動構造的所有成員,因此Person將定義隱式移動建構式來逐一移動構造成員。
這是添加時使用std::move的mData(std::move(data))。沒有它data是一個左值,而是使用復制構造每個成員的隱式復制建構式。
復制構建 astd::string通常比移動構建它的成本更高,這可能是該工具警告這種情況的原因,但如果std::string不存在則不會。移動構造和復制構造int成員是完全相同的操作。
如果您不想每次都檢查班級有哪些成員,您可以簡單地始終std::move在這些情況下使用。例如更改mId(id)為mId(std::move(id))是沒有意義的,因為id它是一個標量型別,但它也不會使任何事情變得更糟。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/429753.html
上一篇:Julia:sortslices:是否可以將排序邏輯作為變數而不是文字傳遞?
下一篇:為什么python在這里變形
