とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

ええええ…。initializer_listさんの悲劇

もしかして {} を置ける場所って限られてるのかな。FDIS未確認。誰か頼む(丸投げ)。

#include<vector>
#include<initializer_list>
#include<algorithm>

template<class T, class Allocator>
bool operator==(std::vector<T, Allocator> const & v, std::initializer_list<T> il)
{
 return std::equal(v.begin(), v.end(), il.begin());
}

int main()
{
 std::vector<int> v{0, 1, 2};

 operator==(v, {0, 1, 2}); // OK.
 v == {0, 1, 2}; // Error... Oh...
}

実行結果(コンパイルエラー):

a.cpp: In function 'int main()':
a.cpp:16:7: error: expected primary-expression before '{' token
a.cpp:16:7: error: expected ';' before '{' token

operator== と明示すればOKなのに,単に == と書くとダメ。試したのは g++4.6.0 と g++4.7.0 20110514 (experimental)。
もしこれが仕様ならしょーもない話。どうしてこんなことになっているのか。g++のバグ(or 未実装)であったらと願う…。

追記:

コメントいただきました。
どうやら,これは仕様のようです。あそこでは {0, 1, 2} と書けないみたい。コメントにある方法を使うか initializer_list{0, 1, 2} と書くしかないですね。