gpt4 book ai didi

c++ - S() 与 S{} 之间的区别?

转载 作者:行者123 更新时间:2023-12-03 08:30:17 24 4
gpt4 key购买 nike

在下面的代码中,两个赋值有什么区别?在这两种情况下, value.v 是否会被默认构造,而 x 会被初始化为 42?

struct S
{
std::vector<int> v;
int x = 42;
};
S value;

void foo()
{
value = S();
value = { };
}

最佳答案

S()S{}在几乎所有情况下都意味着同样的事情。但并非所有情况。

  • 如果 S不是类类型,同样的事情:值初始化。
  • 如果 S是一个不是聚合的类类型,仍然主要意味着相同的事情:值初始化。除了以下情况:
    struct X { X(std::initializer_list<int>); };
    auto x1 = X(); // ill-formed
    auto x2 = X{}; // ok, calls constructor
  • 如果 S是一个聚合,那么 S()是值初始化,但 S{} s 聚合初始化。即使这在很多时候也意味着同样的事情。但并非所有时候。

  • 示例 1:显式默认构造函数使聚合初始化格式错误
    struct A { explicit A(int = 0); };
    struct B { A a; };

    B b; // OK
    B b2 = B(); // OK
    B b3{}; // error through trying to copy-list-initialize a = {}

    示例 2:某些上下文中的值初始化首先进行零初始化
    struct C { C() {} int i; };
    struct D { C a; };

    D d1{}; // d1.a.i is indeterminate
    D d2 = D(); // d2.a.i is zero

    但是在 OP 示例中,虽然 S是具有隐式定义的默认构造函数的聚合 - 这是一个有趣的案例。但是在这里,额外的零初始化没有改变语义,我们正在初始化 x42和默认构造 v无论哪种方式。

    请注意,在 OP 中,这也会调用(并打算调用)来自 S{} 的移动赋值运算符。 :
    value = { };

    这也有可能完全调用不同的运算符,因为 {}最终可能会在不同的赋值运算符重载中将“更好”绑定(bind)到某些不同的参数。 std::optional 必须跳过一些钩子(Hook)以确保 opt = {}实际上调用了移动赋值运算符。

    关于c++ - S() 与 S{} 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59887383/

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