运算符是否可以为initializer_list文字重载?

时间:2013-01-16 23:55:19

标签: c++ operator-overloading initializer-list

我正在尝试为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 '{'

1 个答案:

答案 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只能出现在要初始化某些内容的上下文中。