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:typedefnode的定义中的用法是多余的,你可以直接写成struct node ... ;

【讨论】:

@Const 至少 C++20 让它好一点.. 我们在每个语言标准更新中所说的“更好”?! 好东西数组就像一个魅力然后......哦等等......

以上是关于C++ 初始化奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

C++构造奇怪的未初始化指针

Std::vector 被初始化为垃圾。奇怪的行为。有啥想法吗?

Firebase:混合 C++ 和 Objective-C SDK 可以吗?

使用 GNU C++ 的复合文字(也许是 UB?)初始化结构的奇怪现象

未初始化的 C++ 结构的行为

RijndaelManaged 施工期间的奇怪行为