首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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...

注记

直接初始化比复制初始化更宽松:复制初始化只考虑非-显式构造函数和非显式用户定义转换函数,而直接初始化则考虑所有构造函数和所有用户定义的转换函数。

二次

代码语言:javascript
复制
#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';
}

二次

产出:

二次

代码语言:javascript
复制
test aaaaaaaaaa 1 2

二次

另见

  • 默认初始化
  • 复制初始化
  • 聚合初始化
  • 列表初始化
代码语言:txt
复制
 ? cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com