C++ 类对象的复制列表初始化是否为用户定义的转换 #包括 结构数据{ 数据(整数){ } } int main(){ 数据d={0};//#1 }

C++ 类对象的复制列表初始化是否为用户定义的转换 #包括 结构数据{ 数据(整数){ } } int main(){ 数据d={0};//#1 },c++,language-lawyer,C++,Language Lawyer,正如上面的代码所示,#1调用是否包含用户定义的转换?在我对标准的理解中,我认为它不 用于复制列表初始化规则 否则,如果T是类类型,则会考虑构造函数。将枚举适用的构造函数,并通过重载解析([over.match]、[over.match.list])选择最佳构造函数。如果转换任何参数都需要缩小转换(见下文),则程序的格式不正确 如果没有找到可行的初始值设定项列表构造函数,将再次执行重载解析,其中候选函数是类T的所有构造函数,参数列表由初始值设定项列表的元素组成 该标准仅说明最佳匹配构造函数用于初

正如上面的代码所示,#1调用是否包含用户定义的转换?在我对标准的理解中,我认为它不
用于复制列表初始化规则

否则,如果T是类类型,则会考虑构造函数。将枚举适用的构造函数,并通过重载解析([over.match]、[over.match.list])选择最佳构造函数。如果转换任何参数都需要缩小转换(见下文),则程序的格式不正确

如果没有找到可行的初始值设定项列表构造函数,将再次执行重载解析,其中候选函数是类T的所有构造函数,参数列表由初始值设定项列表的元素组成

该标准仅说明最佳匹配构造函数用于初始化对象,该对象是通过使用
初始值设定项列表
的元素初始化的,它不同于复制初始化(复制初始化说明“用户定义的转换序列,可以从源类型转换为目标类型”,显式定义复制初始化需要用户定义转换)
所以
datad={0};=>数据d(0)除了标准转换之外,没有用户定义的转换?我的理解正确吗?
然而,另一个术语

类对象的类型转换可以由构造函数和转换函数指定。这些转换称为用户定义的转换,用于隐式类型转换(子句[conv])、初始化和显式类型转换

上述术语的意思是,如果初始化的目标类型是类类型,并且需要使用构造函数或转换函数,那么转换是“用户定义的转换”
我被这些术语弄糊涂了,
datad={0}是否为用户定义的转换

类对象的类型转换可以由构造函数和转换函数指定


用户定义的转换首先是类型转换。在初始化中
数据d={0},甚至没有类型转换,因此没有用户定义的转换。

您的示例正是标准(第三个)中给出的示例。。。这里不需要任何转换。那么,什么?第三个是什么,你能在这里传递这个例子吗?或者更详细的回答[dcl.init.list]中的一个…是的,我明白了,但是这个例子没有清楚地解释初始化是否是一个转换…总之,我的理解正确吗?我提到的案例的复制列表初始化没有用户定义的转换?那么你的意思是
Data d=0不在
数据d={0}中。对吗?更改上下文,例如
void func(数据)
对于
func({0})
这是一个概念上用户定义的重载解析转换,对吗?@jackX概念转换不同于实际转换,仅用于重载解析。我想你说的是实际转换。是的,我知道,对于实际转换
datad={0}
除了标准转换之外,没有任何转换,对于重载解析,例如
func({0})
,它是概念上的用户定义转换,我在注释中的问题是针对另一个您没有回答我的问题,thanks@jackX但是没有重载解析需要从
0
转换为
数据
,因此询问它是否包含此类概念性的用户定义转换是没有意义的。确切地说,有关重载解析的注释中的问题是