![](/img/trans.png)
[英]Overloading assignment operator when the object is on the right-hand side of the assignment
[英]Why can I use initializer lists on the right-hand side of operator += but not operator+?
這是一個早期問題的后續問題,為什么我不能使用大括號括起初始化器作為operator+
的參數 ,這是通過查看前面關於該主題的問題來解決的 。
考慮以下C ++代碼,您可以在ideone.com上試用 :
#include <iostream>
#include <initializer_list>
using namespace std;
struct AddInitializerList {
void operator+= (initializer_list<int> values) {
// Do nothing
}
void operator+ (initializer_list<int> values) {
// Do nothing
}
};
int main() {
AddInitializerList adder;
adder += {1, 2, 3}; // Totally legit
adder + {1, 2, 3}; // Not okay!
return 0;
}
main
中使用operator+
和大括號括起初始化列表的行不能編譯(並且在詢問之前的問題后,我現在知道為什么會這樣)。 但是,我很困惑為什么在main
中使用opeartor+=
的代碼確實編譯得很好。
我很困惑,為什么我可以重載+=
並讓它工作得很好,而重載+
似乎在這里工作。 標准中是否有特定的規定允許在+=
運算符但不包含+
運算符的上下文中使用括號括起的初始值設定項? 或者這只是一個奇怪的編譯器怪癖?
C ++14§5.17/ 9:
“ braced-init-list可能出現在右側
- 標量的賦值,在這種情況下,初始化列表最多只能包含一個元素。
x={v}
的含義,其中T
是表達式x
的標量類型,是x=T{v}
的含義。x={}
的含義是x=T{}
。- 對類類型對象的賦值,在這種情況下,初始化列表作為參數傳遞給由重載決策(13.5.3,13.3)選擇的賦值運算符函數。
這適用於一個 +=
通過其$ 5.7 / 7等價B到A =
一個 +
B(不同之處在於一個用於只計算一次+=
)。 換句話說,由於MM的評論,由於內置運算符的等價性, +=
被視為賦值運算符,而不是特殊的更新運算符。 因此,上面關於“賦值”的引用文本適用於+=
。
+=
運算符是復合賦值 。 該標准明確允許在賦值右側的初始化列表:
§8.5.4/ 1 [...]注意:可以使用列表初始化
...
- 在作業的右側(5.17)
§5.17談論所有任務,包括復合任務:
賦值表達式:
- 條件表達式
- logical-or-expression assignment-operator initializer-clause
- throw-expression賦值運算符:一個
=
*=
/=
%=
+=
-=
>>=
<<=
&=
ˆ=
|=
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.