类对象的复制列表初始化是用户定义的转换吗


#include <iostream>
struct Data{
Data(int){
}
}
int main(){
Data d = {0};  //#1
}

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

否则,如果T是类类型,则考虑构造函数。枚举适用的构造函数,并通过重载解析([over.match],[over.maching.list](选择最佳构造函数。如果需要缩小转换范围(见下文(来转换任何参数,则程序是格式错误的

[over.match.list]

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

标准只说最佳匹配构造函数用于初始化通过使用CCD_ 1的元素初始化的对象,它与复制初始化不同(复制初始化说">用户定义的可以从源类型转换到目标类型的转换序列",明确定义复制初始化需要用户定义的转换(
那么Data d = {0}; => Data d(0);除了标准转换之外没有用户定义的转换?我的理解正确吗
然而,另一个术语[class.cov]

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

以上术语的意思是,如果初始化的目标类型是类类型,并且需要使用构造函数或转换函数,那么转换就是"用户定义的转换">
我对这些术语感到困惑,Data d = {0};到底是不是用户定义的转换?

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

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

最新更新