Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中的对象初始化语法(t Obj= {…}与t Obj{{}})_C++_Constructor_Initialization_List Initialization_Uniform Initialization - Fatal编程技术网

C++中的对象初始化语法(t Obj= {…}与t Obj{{}})

C++中的对象初始化语法(t Obj= {…}与t Obj{{}}),c++,constructor,initialization,list-initialization,uniform-initialization,C++,Constructor,Initialization,List Initialization,Uniform Initialization,两种初始化形式,T obj={…}和T obj{…}之间有什么区别? 我最初认为T obj={…}是T obj=T{…}的缩写,其中一个临时对象被复制到我们的新对象中。这虽然不执行复制构造函数,但需要它的存在和对它的访问。但是,当我通过使构造函数私有来阻止这个特定类中的复制构造函数访问时,没有出现错误。 这意味着不涉及复制机制。那么“=”符号的功能是什么? 我曾提及以下问题,但因没有解释而感到不满: 编辑:类似地,int-arr[]{…}和int-arr[]={…}之间有区别吗?我问这个问题是

两种初始化形式,T obj={…}和T obj{…}之间有什么区别? 我最初认为T obj={…}是T obj=T{…}的缩写,其中一个临时对象被复制到我们的新对象中。这虽然不执行复制构造函数,但需要它的存在和对它的访问。但是,当我通过使构造函数私有来阻止这个特定类中的复制构造函数访问时,没有出现错误。 这意味着不涉及复制机制。那么“=”符号的功能是什么? 我曾提及以下问题,但因没有解释而感到不满:

编辑:类似地,int-arr[]{…}和int-arr[]={…}之间有区别吗?我问这个问题是想看看我是否能将统一初始化和列表初始化进行对比。

它们的效果几乎完全相同:

tx={1,2,3}; tx{1,2,3}; 从技术上讲,带=的版本称为复制列表初始化,另一个版本称为直接列表初始化,但这两种形式的行为都由列表初始化行为指定

区别在于:

如果复制列表初始化选择了显式构造函数,则代码格式错误。 如果T为自动,则: 复制列表初始化推导std::initializer\u list 直接列表初始化只允许列表中的单个元素,并推断出元素的类型。 更多信息:

如果T是数组类型,则上述内容仍然适用;由于数组列表初始化始终是聚合初始化,因此从未选择构造函数,因此这两个版本在所有情况下都是相同的


T obj=T{…}排除auto与T obj{…}完全相同,因为C++17,即obj的直接列表初始化。在C++17之前,有一个临时语句的直接列表初始化,然后从临时语句复制obj的初始化。

我认为比较这两种语法不是你真正的问题

在我看来,您似乎期望C++17省略能够像标准允许的、由许多实现执行的C++17之前的优化一样运行

在这种优化中,虽然可以省略复制构造函数调用,但它必须有效且可访问

C++17省略的情况并非如此

这是一个真正的省略,仅仅写T{}并不能真正创建一个T,而是说我想要一个T,并且只有当需要时才实现一个实际的临时性


这个事实的多余的话语实际上被压缩成一个,所以尽管尖叫,我还是想要一个T!我想要一个T!我想要一个T!我想要一个T!这孩子最后还是只得了一个T。您使用的是哪种标准?C++17省略可以解释您的结果。不过也要注意,初始值设定项中的=经常会产生误导。关于这一主题存在不止一个问题;你的书也应该讨论这个话题。@swithwings,我正在使用C++17。即使使用省略,唯一发生的事情就是不调用复制构造函数。但它的存在和使用是必需的。如果我定义了一个复制构造函数并将其隐藏在类中,我基本上不是在告诉编译器不支持复制操作吗?它使用默认值,然后隐式生成了移动构造函数。@Ааааааааааа,那么,我所写的两个语句之间有什么区别呢?@Аааааааааааааааааааааааааа1072。但是T obj=param1,param2不起作用。为什么呢?我确实对省略感到困惑,但你的回答澄清了这一点。是否有任何资源可以详细解释这些语言构造?但T obj=param1,param2不起作用。为什么呢?因为这不是C++支持的初始化语法。详细资料: