C++ 初始化奇怪的行为
Posted
技术标签:
【中文标题】C++ 初始化奇怪的行为【英文标题】:C++ initialization strange behavior 【发布时间】:2021-12-06 03:12:28 【问题描述】:typedef struct node
int val;
int val2;
node(int a, int b) : val(a), val2(b)
node(int val) = delete;
node;
int main()
node a = 3;
cout << a.val << " " << a.val2 << endl;
return 0;
上面的代码给出了编译错误,表明使用了已删除的函数node::node(int)
。
但是,当我删除 node(int a, int b) : a(val), b(val2)
时,此代码编译没有问题。这将如何发生?
【问题讨论】:
IDK 如果它可以解决问题,但您可能打算改为写node(int a, int b) : val(a), val2(b)
。
对不起,这是一个错字,我已经编辑过了。但我的问题仍然有效。
恭喜,您了解到 C++ 是棘手的。这是一种通过仪式。
【参考方案1】:
在 C++20 之前,aggregate type 允许显式删除构造函数。如果你去掉node(int a, int b)
,只留下node(int val) = delete;
,node
被认为是聚合,node a = 3;
执行聚合初始化,构造函数将不会被使用,因为效果a.val
被初始化为3
和@987654329 @直接初始化为0
。
没有用户提供的构造函数(允许显式默认或删除的构造函数)(C++11 起)(C++17 前)
没有用户提供的、继承的或显式的构造函数(允许显式默认或删除的构造函数)(C++17 起)(C++20 前)
C++20 已修复此行为。 node a = 3;
执行list initialization,将使用删除的构造函数,代码格式错误。
没有用户声明或继承的构造函数(C++20 起)
BTW:typedef
在node
的定义中的用法是多余的,你可以直接写成struct node ... ;
。
【讨论】:
@Const 至少 C++20 让它好一点.. 我们在每个语言标准更新中所说的“更好”?! 好东西数组就像一个魅力然后......哦等等......以上是关于C++ 初始化奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章
Std::vector 被初始化为垃圾。奇怪的行为。有啥想法吗?
Firebase:混合 C++ 和 Objective-C SDK 可以吗?