使用"X x(42)"和"X x = 42"的对象构造的差异?

inn*_*nti 7 c++ constructor explicit-constructor

比方说,我们有一流的X与定义的构造X(int value).

这在语义上是否相同?

X x = 42;
X x(42);
Run Code Online (Sandbox Code Playgroud)

我相信只有当我们将显式关键字添加到X的构造函数时才会出现差异.否则编译器会将表达式减少X x = 42;X x(42);

如果我错了,请纠正我.

ava*_*kar 7

表格

X x = 42;
Run Code Online (Sandbox Code Playgroud)

要求构造函数是非显式的,并且存在可访问的复制构造函数.允许实现构造一个临时的并将其复制,但我知道没有实现.

  • @Pubby:是的 - 这被称为_copy initialization_有一个原因.; - ]虽然在实践中,它总是被遗忘. (3认同)
  • 不,不允许构建临时的.你把它与`X x = X(42)`混淆了吗? (2认同)

Jas*_*son 5

从语义上讲,这两个操作对于规范中的语言是不同的,但编译后的有效结果在以下情况下是相同的:

  1. 有一个参数构造函数X可以采用整数类型,参数类型不是非const l值引用
  2. 有单个参数的构造X,其中一个组成型可转化为参数类型,并且其中所述参数再次不是非const -1-值参考
  3. 在#2的情况下,构造函数未声明为 explicit

  • 这是一个*长*的句子. (4认同)