gpt4 book ai didi

c++ - 为什么我可以在运算符 += 的右侧使用初始化列表而不是运算符 +?

转载 作者:IT老高 更新时间:2023-10-28 21:39:22 25 4
gpt4 key购买 nike

这是 an earlier question about why I can't use a brace-enclosed initializer as an argument to operator+ 的后续事件,通过查看 this earlier question on the subject 已解决.

考虑以下 C++ 代码,您可以 try live at 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 中使用 operator+= 的代码确实编译得很好。

我很困惑为什么我可以重载 += 并让它正常工作,而重载 + 似乎在这里不起作用。标准中是否有特定规定允许在 += 运算符但不允许在 + 运算符的上下文中使用大括号括起来的初始化程序?或者这只是一个奇怪的编译器怪癖?

最佳答案

this question 的回答中有说明(与您链接的问题相关联)。

语言语法只允许在某些语法上下文中使用大括号列表,而不是代替任意表达式。该列表包括赋值运算符的右侧,但一般不包括运算符的右侧。

+=是一个赋值运算符,+不是。

赋值表达式的语法是:

  assignment-expression:     conditional-expression     logical-or-expression assignment-operator initializer-clause     throw-expression  assignment-operator: one of      = *= *= /= %= += -= >>= <<= &= ^= |=  

关于c++ - 为什么我可以在运算符 += 的右侧使用初始化列表而不是运算符 +?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42602382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com