在下面的代碼中,令我驚訝的是,{ }似乎創建了一個默認的初始化實體 ofint而不是 of A。
struct A {
int i = 1;
A() = default;
A& operator=(const A& a) {
this->i = a.i;
return *this;
}
A& operator=(int i) {
this->i = i;
return *this;
}
};
int main() {
A a;
a = { };
return a.i;
}
用什么規則決議a = { }?我認為這a = { }必須等同于a = decltype(a){ }.
此處發生的初始化型別的正確術語是什么?
這里有一個關于 Godbolt的例子。在-O0大會上準確顯示正在使用哪個功能。除非int賦值運算子被移除,否則A::operator=(int)呼叫。
uj5u.com熱心網友回復:
首先,braced-init-list{}可用于初始化intand A,它們也被視為轉換,并且從{}to的轉換int在多載決議中獲勝,因為從{}to A(via A::A())的轉換被認為是用戶定義的轉換。
賦值運算子并不特殊,編譯器只是收集operator=多載集中所有可行的s,然后通過多載決議來確定應該選擇哪一個。如果你添加另一個operator=(float)你會得到一個不明確的錯誤,因為從{}toint和 from {}tofloat的轉換都被認為是具有相同等級的標準轉換,這比用戶定義的轉換要好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/394777.html
上一篇:如何正確指定遞回模板類成員函式?
