【发布时间】:2014-09-05 22:23:36
【问题描述】:
今天,我偶然发现了 these standard declarations 的 std::vector 构造函数:
// 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() );
这两种模式有什么区别,它们的(缺点)优点是什么?
它们是严格等价的吗?编译器会从第一个生成类似于第二个的东西吗?
【问题讨论】:
-
你说的是“STL”容器。您是指标准本身规定的这些标准库容器成员函数的签名,还是某些特定实现的代码?
-
@LightnessRacesinOrbit 我的意思是前者:我假设这些函数的签名是标准的(en.cppreference.com 说标准发生了变化 - “自 C++14 以来”)。
-
@LightnessRacesinOrbit 我不太明白要编辑什么; “STL”错了吗?对我来说,它是使用模板的标准库的一部分(因此是标准的“模板”库)。还是别的什么?
-
经过一番研究,我明白你的意思了。但是,“stdlib”标签似乎自动更改为“std”,这也是关于 Ruby 的,并且与“std”标签相比,关注者和问题要少得多。相当误导。
-
没关系;没有发现 cppreference.com 的链接。这足以表明您在谈论标准签名,而不是一些摇摆不定的不兼容实现代码。