在C++98中,
std::vector
的填充构造函数原型有一个初始化器的默认值。explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
C++11使用两个原型。
explicit vector (size_type n);
vector (size_type n, const value_type& val,
const allocator_type& alloc = allocator_type());
(在C++14中,填充构造函数又一次发生了变化,但这不是本问题的重点。)
一个参考链接在这里。
C++11为什么弃用了默认初始化值value_type()
?
顺便说一下,我尝试使用clang++ -std=c++11
编译以下代码,但它报错了,这意味着值类型仍然需要像S() {}
那样有一个默认构造函数,即支持默认构造。
#include <vector>
struct S {
int k;
S(int k) : k(k) {} // intentionally remove the synthesized default constructor
};
int main() {
std::vector<S> s(5); // error: no matching constructor
}
S
没有默认构造函数。而且C++11并没有废弃默认值,那个单一的构造函数被替换成了另外两个构造函数。 - Praetorian