构造函数:默认和委托参数之间的区别

时间:2014-09-05 22:23:36

标签: c++ std c++14

今天,我偶然发现了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)的优势是什么? 它们是否完全等效 - 编译器是否生成类似于第一个的第二个?

1 个答案:

答案 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