基元类型初始化的构造函数语法和赋值语法之间的差异

Differences between constructor syntax and assignment syntax for primitive type initialisation

本文关键字:语法 赋值 之间 构造函数 类型 初始化      更新时间:2023-10-16

在阅读一位同事写的一些代码时,我偶然发现了使用构造函数语法初始化基元类型变量。比如下面的内容:

#include <iostream>
int main()
{
    using namespace std;
    // initialized using assignement syntax (copy initialisation)
    int titi = 20;
    cout << "titi=" << titi << "n"; // got 20 in titi, it works
    // initialized using constructor syntax (direct initialization)
    int toto(10);
    cout << "toto=" << toto << "n"; // got 10 in toto, it works
}

我的自然倾向是坚持赋值语法,因为它是历史语法,而且很容易,而且存在明显的兼容性问题(构造语法不符合有效的C)。

我仍然想知道这两种语法之间是否还有其他不明显的区别?如果它们的意思是一样的?考虑到未来的维护/代码进化问题或可读性问题,其中一种或另一种形式的优缺点是什么?

对于int这样的简单类型,没有区别。对于类类型,即所谓的"构造函数语法"直接初始化,以及所谓的"赋值语法"复制初始化。除非该类支持复制,因此倾向于直接初始化(需要注意的是最麻烦的解析问题)。有些人则表示赞同基于同质性:在任何地方都使用相同的格式。

构造函数语法在处理模板时很有用,因为您不知道类型是基元类型还是类。