【问题标题】:Difference in object construction using "X x(42)" and "X x = 42"?使用“X x(42)”和“X x = 42”构建对象的区别?
【发布时间】:2026-01-31 04:00:01
【问题描述】:

假设我们有定义构造函数X(int value) 的类X。

这在语义上是否等效?

X x = 42;
X x(42);

我相信只有在 X 的构造函数中添加 explicit 关键字时才会出现差异。 否则编译器会将表达式X x = 42; 简化为X x(42);

如果我错了,请纠正我。

【问题讨论】:

    标签: c++ constructor explicit-constructor


    【解决方案1】:

    表格

    X x = 42;
    

    要求构造函数是非显式的并且有一个可访问的复制构造函数。允许该实现构造一个临时的并将其复制过来,但我所知道的任何实现都没有这样做。

    【讨论】:

    • 会绕过显式赋值运算符吗?我本以为它会走那条路。但不可否认,我的大脑有点模糊。
    • 不,不允许构建临时的。您是否将其与 X x = X(42) 混淆了?
    • @Pubby :是的——这被称为 复制初始化 是有原因的。 ;-] 虽然在实践中,它总是会被忽略。
    • @MichaelWilson:该语法中没有 assignment-operator
    • @Pubby,ildjarn 说的。实际上,更准确地说,标准实际上直接说创建一个临时然后复制。正是由于复制省略规则,实现才允许直接构造对象。
    【解决方案2】:

    根据规范中的语言,这两种操作在语义上有所不同,但在以下情况下编译后的有效结果是相同的:

    1. X 的单个参数构造函数可以采用整数类型,并且参数类型不是非常量左值引用
    2. X 有一个单参数构造函数,其中整数类型可以转换为参数类型,并且参数又不是非 const 左值引用
    3. 在#2的情况下,构造函数没有声明为explicit

    【讨论】: