2014-09-05 109 views
18

今天之间的区别,我偶然发现std::vectorthese standard declarations构造函数:构造函数:违约和委托参数

// until C++14 
explicit vector(const Allocator& alloc = Allocator()); 
// since C++14 
vector() : vector(Allocator()) {} 
explicit vector(const Allocator& alloc); 

这种变化可以在大多数标准集装箱中可以看出。稍微不同的是为例std::set

// until C++14 
explicit set(const Compare& comp = Compare(), 
       const Allocator& alloc = Allocator()); 
// since C++14 
set() : set(Compare()) {} 
explicit set(const Compare& comp, 
       const Allocator& alloc = Allocator()); 

两者有什么模式,什么是他们的(DIS)的优势有什么区别?
它们是否严格等价 - 编译器是否生成类似于第一个的东西?

+1

你说“STL”容器。你的意思是这些标准库容器成员函数的标识是由标准本身或者某些特定实现的代码所规定的吗? – 2014-09-05 22:34:26

+0

@LightnessRacesinOrbit我的意思是前者:我假设这些函数的签名是标准的(en.cppreference.com表示有一个来自标准的改变 - “自C++ 14以来”)。 – Nelfeal 2014-09-05 22:45:21

+0

@LightnessRacesinOrbit我真的不明白要编辑什么;是“STL”错误?对我来说,它是标准库的一部分,它使用模板(因此标准的“模板”库)。或者是别的什么 ? – Nelfeal 2014-09-06 08:11:05

回答

18

不同的是,

explicit vector(const Allocator& alloc = Allocator()); 

是即使在使用默认参数的情况下explicit,而

vector() : vector(Allocator()) {} 

不是。 (在第一种情况下的explicit需要防止Allocator期从被隐式转换为一个vector

这意味着你可以写

std::vector<int> f() { return {}; } 

std::vector<int> vec = {}; 

在第二但不是第一个。

参见LWG issue 2193

+0

如果显式关键字被删除,我认为分配器可以隐式转换为向量? – Nelfeal 2014-09-05 22:34:09

+0

@Nelxiost正确,我们也不想要。 – 2014-09-05 22:34:27

+3

哦,这比我在阅读这个问题时所期望的更有趣。 – 2014-09-05 22:35:10