如何初始化良好的初始化?

Wak*_*zil 5 c++ initialization language-lawyer c++17

[class.conv.ctor]/2中的示例包含以下初始化:

Z a3 = Z(1);    // OK: direct initialization syntax used
Run Code Online (Sandbox Code Playgroud)

这怎么被认为是直接初始化语法?

Nic*_*las 8

Z(1)将直接初始化一个prvalue.然后,prvalue将用于初始化对象.根据保证省略规则,没有临时跟踪副本.prvalue直接初始化对象.因此,Z a3 = Z(1);完全等同Z a3(1);.

在pre-C++ 17中,这将执行prvalue临时的直接初始化,然后是临时的(几乎肯定省略的)副本到对象中a3.无论副本是否被省略,prvalue的初始化都是通过直接初始化来完成的.初始化a3是通过复制初始化,但这是通过复制构造函数,而不是explicit.

  • @WakeupBrazil为什么你不期望它不编译?BTW它也应该用c ++ 98编译. (3认同)
  • @WakeupBrazil:我不确定你在这里谈论什么.`Z(1)`是直接初始化语法,正如您发布的链接所明确说明的那样.`Z a3 = ...`执行复制初始化,可能会或可能不会被省略,但任何一种方式都不会调用任何显式构造函数. (3认同)
  • @WakeupBrazil:"*我正在谈论用于初始化a3的语法.*"你*谈论的是什么并不重要.因为*comment*正在讨论用于初始化临时的语法. (3认同)
  • @WakeupBrazil叹了口气.所以呢?它.确实.不.物.直接初始化指的是`Z(1)`,正如答案中已经解释过的那样. (2认同)