【发布时间】:2015-04-07 01:49:14
【问题描述】:
当类的构造函数重载采用std::initializer_list 时,即使其他构造函数重载看起来更匹配,这个重载也会优先。这个问题在 Sutter 的 GotW#1,第 2 部分以及 Meyers 的 Effective Modern C++,第 7 项中有详细描述。
这个问题的典型表现是在大括号初始化std::vector时:
std::vector<int> vec{1, 2};
// Is this a vector with elements {1, 2}, or a vector with a single element 2?
Sutter 和 Meyers 都建议避免使用 initializer_list 构造函数重载可能导致程序员产生歧义的类设计。
萨特:
准则:当你设计一个类时,避免提供一个构造函数 用 initializer_list 构造函数模棱两可地重载,因此 用户不需要使用 () 来访问这样一个隐藏的构造函数。
迈耶斯:
因此,最好设计您的构造函数,以便 调用的重载不受客户端是否使用括号或 大括号。换句话说,从现在被视为错误的东西中学习 std::vector 接口的设计,并将您的类设计为 避免它。
但他们都没有描述 如何 vector 应该被设计来避免这个问题!
所以这是我的问题:应该如何设计 vector 以避免 initializer_list 构造函数重载的歧义(不丢失任何功能)?
【问题讨论】:
标签: c++ c++11 vector initializer-list