次のコードは、GCC 4.7.2 または Clang 3.2 ではコンパイルできません。
#include <vector>
#include <functional>
int main()
{
std::vector<std::function<void()>> a;
std::vector<std::function<void()>> b{a};
}
問題は、明らかにコピー コンストラクターを呼び出す必要があるときに、コンパイラーが initializer_list を使用して b を作成しようとすることです。ただし、標準では initializer_list コンストラクターを優先する必要があるため、これは望ましい動作のようです。
このコードは、他の std::vector に対しては正常に機能しますが、std::function の場合、コンパイラは、initializer_list コンストラクターが必要か、別のコンストラクターが必要かを認識できません。
それを回避する方法はないようです。その場合、テンプレート化されたコードで均一な初期化を使用することはできません。これは非常に残念なことです。
一方、Visual Studio (2012 年 11 月の CTP) はこれについて文句を言いません。しかし、initializer_list のサポートは現時点ではあまり良くないため、バグである可能性があります。