10

の演算子をオーバーロードしようとして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 では、演算子関数には、型がクラス、列挙型、またはいずれかへの参照であるパラメーターが少なくとも 1 つ必要であり、標準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 '{'
4

1 に答える 1

6

私の知る限り、13.5/6、

演算子関数は、非静的メンバー関数であるか、非メンバー関数であり、型がクラス、クラスへの参照、列挙、または列挙への参照であるパラメーターを少なくとも 1 つ持つ必要があります。

これは不可能です。ブレース初期化リストは s と同じではなく、std::initializer_list交換可能ではありません。ただし、以下は機能するはずです。

std::initializer_list<int>({1,2}) + std::initializer_list<int>({2,1})

またはこれ:

operator+({1,2}, {2,1})

更新:明確にするために、要点は、OPによって提案されたコンテキストにブレース初期化リストを表示できるようにする規則が言語文法にないということです。ブレース初期化リストは、何かが初期化されようとしているコンテキストでのみ表示できます。

于 2013-01-17T00:03:47.943 に答える