以下代码在GCC 4.7.2或Clang 3.2中无法编译:
对于其他 std::vector,此代码将正常工作,但对于 std::function,编译器无法知道您是否要使用 initializer_list 构造函数或其他构造函数。
看起来没有绕过它的方法,如果是这种情况,那么您永远无法在模板代码中使用统一初始化,这将是非常遗憾的事情。
另一方面,Visual Studio(2012 年 11 月 CTP 版)不会抱怨这一点。但目前那里的 initializer_list 支持并不是很好,所以可能是一个 bug。
#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 支持并不是很好,所以可能是一个 bug。
std::function
进行修复。 - Jonathan Wakely