【发布时间】:2017-07-24 22:49:16
【问题描述】:
这是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+= 的代码确实编译得很好。
我很困惑为什么我可以重载+= 并让它工作得很好,而重载+ 似乎在这里不起作用。标准中是否有特定规定允许在 += 运算符而不是 + 运算符的上下文中使用大括号括起来的初始化程序?或者这只是一个奇怪的编译器怪癖?
【问题讨论】:
-
你没有指定你的编译器,但我用 gcc 6.3.1 重现了这个失败,它用“错误:‘{’令牌之前的预期主表达式”向我咆哮。
-
我猜想所有赋值运算符都支持大括号。
-
而
adder + initializer_list<int>{1, 2, 3};工作得很好。 -
是的,
adder.operator+({1, 2, 3});也可以。这很有趣。我似乎找不到adder + { 1, 2, 3 }的任何歧义。想知道为什么会这样决定。 -
是的,这个猜测是正确的。 C++14 §5.17/9.
标签: c++ operator-overloading initializer-list