C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 复制初始化和直接初始化的混乱大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
虑简单陈述(摘自 Is there a difference in C++ between copy initialization and direct initialization?):

A c2 = A();

[注意上面的段落中的大胆句子] – >我的问题是为什么?

现在虑这段代码

class B {};
struct A 
{
  A(B const&) {}
  A(A const&) = delete;
  //A(A const&); //delete above statement and uncomment this statement,//and everything works,even though there in no body of copy constructor Oo
};

A a2 = B();    //error since there is no copy constructor oO

为什么复制初始化需要复制构造函数的存在,即使它在某些时候不需要,如上面的代码所示

请再请一件事:

[注意以下段落中的粗体]

这是否意味着直接初始化可以访问所有构造函数并且可以执行隐式转换序列,而复制初始化所有可以做的是执行隐式转换序列? .我的意思是,直接初始化中的隐式转换与复制初始化中的隐式转换序列不同?

解决方法

评估规则

A a1 = B();   // (1) copy-initialization
A a2 = {B()}; // (2) copy-initialization
A a3{B()};    // (3) direct-initialization

来自[dcl.init]/17

对于a2和a3,初始化程序是braced-init-list,所以我们只进行列表初始化.这最终称为B const&构造函数.

对于a1,第一个子项不适用 – 因为源类型(B)不是目标类型(A)的相同或派生类.因此,我们进入第二个子项目,涉及虑转换函数.有一个(A(B const&))所以我们有效地重写了表达式

A a1_new{A{B{}}};

现在通常,这个额外的副本将被省略.但是你明确禁止它,所以代码无法编译.

至于为何分化?我不知道.似乎复制初始化应该只是直接初始化的语法糖.毕竟,在大多数情况下,它是……

大佬总结

以上是大佬教程为你收集整理的c – 复制初始化和直接初始化的混乱全部内容,希望文章能够帮你解决c – 复制初始化和直接初始化的混乱所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。