我正在尝试为std::initializer_list
重载运算符,但以下内容既不在GCC 4.7.2中编译也不在Clang 3.2中编译:
#include <initializer_list>
void operator+(const std::initializer_list<int>&, const std::initializer_list<int>&);
int main() {
{1, 2} + {3, 4};
}
13.5 / 6表示运算符函数应至少有一个参数,其类型是类,枚举或引用,标准指定initializer_list
作为模板类,所以对我来说似乎是它应该符合要求。然而,显然Clang和GCC都认为我正在尝试使用他们的非标准块表达式。
GCC
Compilation finished with errors:
source.cpp: In function 'int main()':
source.cpp:7:8: warning: left operand of comma operator has no effect [-Wunused-value]
source.cpp:7:9: error: expected ';' before '}' token
source.cpp:7:9: warning: right operand of comma operator has no effect [-Wunused-value]
source.cpp:7:13: error: expected primary-expression before '{' token
source.cpp:7:13: error: expected ';' before '{' token
锵:
Compilation finished with errors:
source.cpp:7:5: warning: expression result unused [-Wunused-value]
{1, 2} + {3, 4};
^
source.cpp:7:9: error: expected ';' after expression
{1, 2} + {3, 4};
^
;
source.cpp:7:8: warning: expression result unused [-Wunused-value]
{1, 2} + {3, 4};
^
source.cpp:7:13: error: expected expression
{1, 2} + {3, 4};
^
2 warnings and 2 errors generated.
这应该编译吗?如果没有,为什么不呢?
修改:
毫不奇怪,VS 2012的11月CTP也失败了:
error C2143: syntax error : missing ';' before '}'
error C2059: syntax error : '{'
error C2143: syntax error : missing ';' before '{'
答案 0 :(得分:5)
据我了解13.5 / 6,
运算符函数应该是非静态成员函数或者是非成员函数并且具有 至少一个参数,其类型为类,对类的引用,枚举或对引用的引用 枚举强>
这不应该是可能的。 Braced-init-lists与std::initializer_list
不同,并且它们不可互换。但是,以下内容应该有效:
std::initializer_list<int>({1,2}) + std::initializer_list<int>({2,1})
或者这个:
operator+({1,2}, {2,1})
更新:为了澄清,重点是语言语法中没有规则允许在OP建议的上下文中显示braced-init-list。如果你愿意的话,Braced-init-lists只能出现在要初始化某些内容的上下文中。