gpt4 book ai didi

c++ - 聚合初始化与统一初始化

转载 作者:行者123 更新时间:2023-12-02 15:20:07 50 4
gpt4 key购买 nike

我对 C++11 统一初始化了解得越多,就越感到困惑。Scott Meyers 在《Effective Modern C++》(第 55 页)中指出,该声明

Widget w2{};

始终调用默认构造函数(即使存在带有 std::initializer_list 参数的构造函数)。

乍一看,这似乎与 Stroustrup 的书《C++ 编程语言》第四版一致,例如根据第1200页的表格声明

std::atomic<T> x;

使原子变量未初始化,而

std::atomic<T> x {};

调用“默认构造函数”,以便 x 代表初始化的 T 对象的值。

但是,我不敢相信std::atomic<T> x;不再调用 C++11 中的默认构造函数,所以我在这里完全感到困惑。

最后,在查看了 C++11 标准(n3337 草案)后,我的困惑更加严重。在第 1102 页,我们有:

template <> struct atomic<integral > {
//[...] list of non-constructor functions
atomic() noexcept = default;
constexpr atomic(integral ) noexcept;
atomic(const atomic&) = delete;
//[...] other non-constructor functions
};

在第 1104 页(第 29.5.5 点)我们看到

The atomic integral specializations and the specialization atomic shall have standard layout. They shall each have a trivial default constructor and a trivial destructor. They shall each support aggregate initialization syntax.

那么具有用户定义构造函数的类现在支持聚合初始化吗?是因为构造函数是 constexpr

当我们写时会发生什么

std::atomic<T> x {};

这是聚合初始化吗?或者调用(简单的)默认构造函数?

最佳答案

So classes with user defined constructor now support aggregate initialization?

只有聚合支持聚合初始化。仅当构造函数定义为默认或删除时,聚合才能具有用户定义的构造函数。

这将在 C++20 中发生变化,根本不允许用户声明构造函数。

Is this so because the constuctor is consexpr?

constexpr 对此没有影响。

std::atomic<T> x {};

Is this the aggregate initialization?

这是列表初始化。如果类型是聚合,则列表初始化将聚合初始化对象。 std::atomic 不是聚合,因为它有一个用户提供的构造函数,该构造函数既不默认也不删除:

constexpr atomic( T desired ) noexcept; // (2) (since C++11)

对于 std::atomic,此列表初始化规则适用:

  • Otherwise, if the initializer list has no elements and T is a class type with a default constructor, the object is value-initialized.

值初始化会调用此类的默认构造函数。

关于c++ - 聚合初始化与统一初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58993745/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com