簡體   English   中英

為什么我可以在operator + =的右側使用初始化列表,但不能使用operator +?

[英]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+=的代碼確實編譯得很好。

我很困惑,為什么我可以重載+=並讓它工作得很好,而重載+似乎在這里工作。 標准中是否有特定的規定允許在+=運算符但不包含+運算符的上下文中使用括號括起的初始值設定項? 或者這只是一個奇怪的編譯器怪癖?

這個問題的答案(與您鏈接的問題相關聯) 對此進行了解釋。

語言語法只允許某些語法上下文中的支撐列表,而不是任意表達式。 該列表包括賦值運算符的右側,但不包括運算符的右側。

+=是賦值運算符, +不是。

賦值表達式的語法是:

\n   賦值表達式:\n      條件表達式\n      logical-or-expression assignment-operator initializer-clause\n      扔表達\n   賦值運算符:一個\n      \n  = *= *= /= %= += -= >>= <<= &= ^= |= 

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等價BA = 一個 + 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM