【问题标题】:What is a Designated Initializer?什么是指定初始化器?
【发布时间】:2020-07-13 13:24:24
【问题描述】:

我希望了解指定初始化程序提供的与直接初始化不同的内容。

例如:

#include <iostream>

struct Subject{

    int x;
    int y;
    int z;

};

int main()
{ 
    Subject subject_d{.x = 1, .y = 2, .z= 3};
    Subject subject_c{1, 2, 3};

    return 0;
}

我们如何去装饰这两条线?细心的,有什么区别?

【问题讨论】:

  • @StoryTeller-UnslanderMonica 我怀疑这是法语动词“décortiquer”的字面“翻译”,其中一个含义是彻底分析某事
  • @StoryTeller-UnslanderMonica 如果喜欢法语单词 -> 皮/壳 ^^ 在那种情况下“如何理解”
  • @rekkalmd:我不明白这个问题。您首先说您了解其中的区别,但随后您会问有什么区别。
  • 有趣。通常,快速的网络搜索不会让我如此悲惨地失败。谢谢大家。
  • @rekkalmd 它允许您省略任何字段的初始化程序。 Subject subject_c{...}; 只允许您省略最后 N 个字段。

标签: c++ c++20 designated-initializer


【解决方案1】:

在您发布的示例中,在行为方面绝对没有区别。聚合被初始化以保存相同的三个值。就可读性而言,可以提出一个论点,即指定的初始化程序版本在发生的事情方面更加明确。它也可以用于服务于文档目的。每个初始化器的预期含义(假设我们很好地命名了成员)都写在它旁边。

超越显式初始化。指定的初始化器也可以很好地与其他 C++ 特性配合使用。请考虑。

struct Subject{
    int x = 0;
    int y = 0;
    int z = 0;
};

你可以写

Subject const s { .y = 2 };

我们为除y 之外的所有字段使用默认值。而变量s 是const,因为我们不希望它改变。这在 const 正确性方面很好。

您可以在没有指定初始化程序的情况下实现类似的效果,但如果我们希望 s 保持 const 会涉及更多样板,并且可以说不会那么简洁明了。简而言之,这就是为什么它们在语言中很不错的原因。

【讨论】:

    【解决方案2】:

    那一行:

    Subject subject_d{.x = 1, .y = 2, .z= 3};
    

    如果您重命名至少一个字段或更改它们的顺序,它将不再编译,因此该表单是“安全的”

    但是

    Subject subject_c{1, 2, 3};
    

    不假设字段的名称,因此如果您交换它们的顺序,每个字段的初始化将不一样而是静默

    【讨论】:

      【解决方案3】:

      这两行在语义上是等价的。两者之一更明确,可以减少软件错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-22
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多