以下代码无法在 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 的支持不是很好,所以它可能是一个错误。