【问题标题】:C++ initialization strange behaviorC++ 初始化奇怪的行为
【发布时间】: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++ 是棘手的。这是一种通过仪式。

标签: c++ initialization c++20 list-initialization aggregate-initialization


【解决方案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 让它好一点..
  • 我们在每个语言标准更新中所说的“更好”?!
  • 好东西数组就像一个魅力然后......哦等等......
猜你喜欢
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2020-07-24
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
相关资源
最近更新 更多