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

Nel*_*eal 20 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 );
Run Code Online (Sandbox Code Playgroud)

在大多数标准容器中都可以看到这种变化.一个稍微不同的例子是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() );
Run Code Online (Sandbox Code Playgroud)

两种模式之间有什么区别?它们(dis)的优势是什么?
它们是否完全等效 - 编译器是否生成类似于第一个的第二个类似的东西?

T.C*_*.C. 21

不同之处在于

explicit vector( const Allocator& alloc = Allocator() );
Run Code Online (Sandbox Code Playgroud)

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

vector() : vector( Allocator() ) {}
Run Code Online (Sandbox Code Playgroud)

不是.(explicit在第一种情况下,必须防止Allocators可以隐式转换为vector.)

这意味着你可以写

std::vector<int> f() { return {}; }
Run Code Online (Sandbox Code Playgroud)

要么

std::vector<int> vec = {};
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,但不是第一种情况.

LWG第2193期.

  • 哦,这比我在阅读这个问题时的预期要有趣得多. (4认同)