【发布时间】:2018-02-06 03:41:52
【问题描述】:
在 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 中,填充构造函数再次更改,但这不是这个问题的重点。)
参考链接是here。
为什么 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
}
【问题讨论】:
-
您在最后展示的示例在 C++11 之前也不会工作,因为
S不是默认可构造的。而且 C++11 并没有弃用默认值,那个单一的构造函数被另外两个替换了。 -
默认值是邪恶的。
-
@Praetorian 是的,我应该说 C++11 删除了构造函数原型中的默认值。
-
@Jesper Juhl 你得详细说明