direct initialization
直接初始化
从构造函数参数的显式集合初始化对象。
句法
T object ( arg T object ( arg1, arg2, ... | (1) | |
---|---|---|
T object { arg }; T object { arg1, arg2, ... }; | (2) | (since C++11) |
T ( other ) T ( arg1, arg2, ... | (3) | |
static_cast< T >( other ) | (4) | |
new T(args, ...) | (5) | |
Class::Class() : member(args, ...) {... | (6) | |
arg{... | (7) | (since C++11) |
解释
直接初始化在以下情况下执行:
1%29带有非空括号表达式列表的初始化
2%29列表初始化序列,如果没有提供初始化程序列表构造函数,并且可以访问匹配的构造函数,那么所有必要的隐式转换都是不缩小的。
3%29初始化prvalue临时功能铸造或带有括号大小的表达式列表。
4%29由静态[医]铸造表达
5%29通过具有非空初始化项的新表达式初始化具有动态存储持续时间的对象。
6%29由构造函数初始化基成员或非静态成员。初始化程序列表
7%29从lambda表达式中的复制捕获的变量中初始化闭包对象成员。
直接初始化的效果如下:
- 如果
T
是类类型,如果初始化器是一个prvalue表达式,其cv-不限定类型与T
类相同,则初始化器表达式本身(而不是从它得到的临时物化)用于初始化目标对象:请参见复制省略。%28自C++17%29
- 如果初始化程序是prvalue表达式,其cv-不限定类型与
T
,初始化器表达式本身,而不是从它得到的临时物化,用于初始化目标对象:复制省略
%28自C++17%29
- 的建设者
T
并通过过载解析选择最佳匹配。然后调用构造函数来初始化对象。
- 否则,如果
T
是一种非阶级类型,标准转换的值转换为T
...
注记
直接初始化比复制初始化更宽松:复制初始化只考虑非-显式构造函数和非显式用户定义转换函数,而直接初始化则考虑所有构造函数和所有用户定义的转换函数。
例
二次
#include <string>
#include <iostream>
#include <memory>
struct Foo {
int mem;
explicit Foo(int n) : mem(n) {}
};
int main()
{
std::string s1("test" // constructor from const char*
std::string s2(10, 'a'
std::unique_ptr<int> p(new int(1) // OK: explicit constructors allowed
// std::unique_ptr<int> p = new int(1 // error: constructor is explicit
Foo f(2 // f is direct-initialized:
// constructor parameter n is copy-initialized from the rvalue 2
// f.mem is direct-initialized from the parameter n
// Foo f2 = 2; // error: constructor is explicit
std::cout << s1 << ' ' << s2 << ' ' << *p << ' ' << f.mem << '\n';
}
二次
产出:
二次
test aaaaaaaaaa 1 2
二次
另见
- 默认初始化
- 复制初始化
- 聚合初始化
- 列表初始化
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。