4
#包括<iostream>结构小工具{小工具(){put(“小工具默认值”);}Gadget(char const*a){put(“Gadget-const char*constructor”);}小工具(小工具常量和其他){put(“小工具副本”);}~Gadget(){put(“\nGadget销毁”);}};结构工程{Work(){put(“默认”);}Work(const Gadget&a){put(“Work-Gadget构造函数”);}//Work(char-const*a){put(“Work-const-char*constructor”);}工作(工作常量和其他){put(“复制”);}~Work(){put(“\nWork destruction”);}};int主(){使用命名空间标准;工作w=“std”;//此处出错;}

但是

工作w(“std”);//工作正常工作w=小工具(“std”);//工作正常工作w=工作(“std”);//工作正常

c++对隐式转换有什么限制吗?如果是,那么隐式转换是在什么上下文中发生的?

1答案1

重置为默认值
7

只有一个用户定义的转换允许在中隐式转换序列(BTW标准转换没有此类限制。)工作w=“std”;执行复制初始化,它需要两个用户定义的转换,一个来自字符常量*小工具,一个来自小工具工作.

工作w(“标准”);执行直接初始化,只有一个用户定义的转换(来自字符常量*小工具)是必需的,然后转换小工具传递给的构造函数工作直接建造w个.

复制初始化中的隐式转换必须产生T型直接从初始值设定项,而直接初始化则需要从初始值设置项到参数的隐式转换T型的构造函数。

工作w=工作(“std”);,一个临时工作显式构造为工作(“标准”)(其工作原理如上所述),然后w个从临时工作.

工作w=小工具(“std”);,一个临时小工具显式构造为小工具(“std”),然后w个从临时小工具; 其中只有一个用户定义的转换(来自小工具工作)是必需的。

4
  • 感谢您的快速回复。我想在初始化中明确一件事,如果在=之前出现的是direct,后面出现的是copy。正确的?
    – 贝吉塔
    评论 2020年11月25日5:56
  • @贝吉塔你可以查看我发布的链接页面,其中列出了直接初始化和复制初始化的所有语法,然后你就可以很容易地找出区别。
    – 宋元耀
    评论 2020年11月25日6:00
  • 当然,谢谢你
    – 贝吉塔
    评论 2020年11月25日6:02
  • 1
    @特德·林格莫抱歉迟到了
    – 贝吉塔
    评论 2020年12月22日11:23

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.