【发布时间】:2012-06-27 09:37:16
【问题描述】:
和Why is copy constructor called instead of conversion constructor?有点关系
初始化有两种语法,直接初始化和复制初始化:
A a(b);
A a = b;
我想知道他们有不同定义行为的动机。对于副本初始化,涉及到一个额外的副本,我想不出那个副本有什么用途。由于它是临时副本,因此可以并且可能会对其进行优化,因此用户不能依赖它的发生-因此,额外的副本本身不足以引起不同的行为。那么……为什么?
【问题讨论】:
-
@Als:也许,我不知道那个标签的用途。不过,这个问题的想法并不是对规范实际上说的内容进行区分,这就是我认为的语言律师。如果允许,我更愿意将其标记为语言设计。
-
+1。好问题。甚至我也想知道为什么它们被设计表现得不同。
-
@moooeeeep 不是真的。我知道有区别,我在问为什么。
-
@Luchian:关于该问题的最佳答案详细说明了您何时使用哪个重要。它实际上说直接初始化可以执行比复制初始化更多的转换,因为直接初始化可以将
b转换为A具有构造函数的任何类型,而复制初始化必须尝试将b专门转换为A或A的派生类。因此,差异的一个合理动机是复制初始化的存在是为了抑制A的任何explicit非复制构造函数。 -
哦,还要抑制从
b到A的转换链,其中涉及两个用户定义的转换,其中第二个是A的构造函数。那里的答案没有解决的是,哪些差异是真正的动机。
标签: c++ initialization history language-design