今天,我偶然发现了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() );
这种变化可以在大多数标准容器中看到。一个稍微不同的例子是{{1}}:
{{1}}
两种模式之间有什么区别?它们(dis)的优势是什么? 它们是否完全等效 - 编译器是否生成类似于第一个的第二个?
答案 0 :(得分:21)
区别在于
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。