这两种C++初始化程序语法在语义上是否有所不同?

Omn*_*ous 6 c++ language-features initializer language-lawyer

假设以下代码是正确编译的合法代码,即T类型名称,这x是变量的名称.

语法一:

T a(x);
Run Code Online (Sandbox Code Playgroud)

语法二:

T a = x;
Run Code Online (Sandbox Code Playgroud)

这两个表达式的确切语义是否有所不同?如果是这样,在什么情况下呢?

如果这两个表达式确实有不同的语义,我也很好奇标准的哪个部分谈到这一点.

此外,如果有特殊情况时,T是标量型的名称(又名,int,long,double,等...),有什么区别时,T是标量型与非标型?

Ton*_*roy 2

从 2014 年 5 月 8 日起(强调我的):

使用初始值设定项表达式作为其参数来调用所选函数;如果该函数是构造函数,则调用会初始化目标类型的临时值。然后,根据上述规则,调用的结果(对于构造函数情况来说是临时的)用于直接初始化作为复制初始化目标的对象。在某些情况下,允许实现通过将中间结果直接构造到正在初始化的对象中来消除直接初始化中固有的复制;请参阅 class.temporary、class.copy。

因此,它们是否等效取决于实现。

8.5.11 也相关,但仅用于确认可能存在差异:

-11- 初始化的形式(使用括号或=)通常无关紧要,但当被初始化的实体具有类类型时就很重要;见下文。仅当要初始化的实体具有类类型时,带括号的初始值设定项才可以是表达式列表。