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;
}
The above code gives compile error showing that use of deleted function node::node(int)
.
However, when I remove node(int a, int b) : a(val), b(val2) {}
, this code compiles without a problem. How would this happen?
Before C++20 explicitly deleted constructors are allowed for aggregate type. If you remove node(int a, int b)
and leave node(int val) = delete;
only, node
is considered as aggregate and node a = {3};
performs aggregate initialization, constructors won't be used, as the effect a.val
is initialized as 3
and a.val2
is initialized as 0
directly.
no user-provided constructors (explicitly defaulted or deleted constructors are allowed) (since C++11) (until C++17)
no user-provided, inherited, or explicit constructors (explicitly defaulted or deleted constructors are allowed) (since C++17) (until C++20)
C++20 has fixed this behavior. node a = {3};
performs list initialization, the deleted constructor will be used and the code is ill-formed.
no user-declared or inherited constructors (since C++20)
BTW: The usage of typedef
in the definition of node
is superfluous, you can just write it as struct node { ... };
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With