This question already has an answer here:
Consider the following example:
#include <iostream>
#include <string>
struct ABC
{
std::string str;
unsigned int id ;/* = 0 : error: no matching constructor for initialization of 'ABC'*/
};
int main()
{
ABC abc{"hi", 0};
std::cout << abc.str << " " << abc.id << std::endl;
return 0;
}
When defining the structure ABC without default value for id clang 3.x and gcc 4.8.x compile the code without problems. However, after adding a default argument for "id" I get the flowing error message:
13 : error: no matching constructor for initialization of 'ABC'
ABC abc{"hi", 0};
^ ~~~~~~~~~
4 : note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
struct ABC
^
4 : note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 2 were provided
4 : note: candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 2 were provided
1 error generated.
Compilation failed
From a technical point of view, what is going on when I define id with a default argument and why is aggregate initialization not possible in that case? Do I implicitly define some sort of constructor?
In c++ struct and classes are the same, except that structs have default public members and classes have private. If you want to use initial values I think you have to write a constructor or use something like this:
Bjarne Stroustrup and Richard Smith raised an issue about aggregate initialization and member-initializers not working together.
The definition of aggregate is slightly changed in C++11 & C++14 standard.
From the C++11 standard draft n3337 section 8.5.1 says that:
But C++14 standard draft n3797 section 8.5.1 says that:
So, when you use in class member initializer (i.e. equal initializer) for the data member
id
in C++11 it no longer remains aggregate & you can't writeABC abc{"hi", 0};
to initialize astruct ABC.
Because it no longer remains aggregate type after that. But your code is valid in C++14. (See live demo here).