【问题标题】:Difference between = and {} syntaxes for initializing a variable in C++在 C++ 中初始化变量的 = 和 {} 语法之间的区别
【发布时间】:2026-01-22 02:25:01
【问题描述】:

我已经阅读了很多 C++ 代码,并且遇到了两种初始化变量的方法。

方法一:

int score = 0;

方法二:

int score {};

我知道int score {}; 会将分数初始化为 0,int score = 0; 也会如此

这两者有什么区别?我已阅读 initialization: parenthesis vs. equals sign 但这并不能回答我的问题。我想知道等号大括号有什么区别,而不是括号。在什么情况下应该使用哪一个?

【问题讨论】:

    标签: c++ c++11 initialization value-initialization copy-initialization


    【解决方案1】:

    int score = 0;执行copy initialization,作为效果,score被初始化为指定值0

    否则(如果Tother 的类型都不是类类型),则在必要时使用standard conversionsother 的值转换为T 的cv-unqualified 版本。

    int score {}; 使用花括号初始化器执行 value initialization 作为效果,从 C++11 开始支持它,

    否则,对象为zero-initialized

    score是内置类型int,最后是zero-initialized,即初始化为0

    如果T是标量类型,则对象的初始值是整数常量零explicitly convertedT

    【讨论】:

    • 使用一个比另一个有优势吗?
    • 应该写一个关于大括号初始化器的完整故事。
    • @AdityaPrakash 由于它们具有相同的效果,我认为这只是一个编码风格问题。对于第一个,它可用于初始化为指定值;对于第二个,它可用于初始化为 默认值
    • 这取决于你正在初始化什么。在编写的示例中没有区别。
    • 空括号是值初始化,对于int类型的变量,它解析为零初始化
    【解决方案2】:

    您可能对 ISO/IEC 14882 8.5.1 感兴趣。它会告诉你 brace-or-equal-initializer 可以是 assignment-expressionbraced-init-list。 在方法 2 中,您在标量类型上使用默认初始化程序,应将其设置为零。

    【讨论】:

      最近更新 更多