隱含參數最近,我讀(不幸的是忘了在哪裏),最好的方式寫操作=是這樣的:明確的拷貝構造函數或價值
foo &operator=(foo other)
{
swap(*this, other);
return *this;
}
的這個代替:
foo &operator=(const foo &other)
{
foo copy(other);
swap(*this, copy);
return *this;
}
這個想法是,如果operator =用右值調用,那麼第一個版本可以優化構建副本。所以當用右值調用時,第一個版本更快,當用左值調用時,兩者是等價的。
我很好奇其他人對此有何看法?由於缺乏明確性,人們會避免第一個版本嗎?我認爲第一個版本可以更好,永遠不會更糟?
什麼是'swap'?如果它是'foo temp = x; X = Y; y = temp;''你有'operator ='和'swap'函數的無限遞歸。 – 2010-01-09 21:55:42
我寫了一個程序來測試@Alexey Malistov的理論,他是正確的 - 我得到了無限遞歸。 – nobar 2010-01-09 23:26:22
任何實現複製和交換習語的類都不能依賴其複製賦值運算符中的默認'std :: swap'實現。這很不用說。 – 2010-01-09 23:37:48