#include <initializer_list>
#include <iostream>
using namespace std;
struct Y {};
struct X
{
X(initializer_list<Y>) { cout << "yay" << endl; }
explicit X() { cout << "boo" << endl; }
};
X f()
{
return {};
}
int main()
{
f();
return 0;
}
This prints out “boo”. Why doesn’t it print out “yay” ?
Is there anyway to differentiate the following two constructions:
X()X{}
or
return X();return {};
or
void g(const X&)
g(X())g({})
Thanks.
No. They are not different constructs.
The primary purpose of the {} constructor syntax was to introduce uniform initialization, to have initialization work the same everywhere. If there was a difference between them, it wouldn’t be uniform.
If you want to use the empty initializer list constructor, you have to state that you’re passing an initializer list explicitly. Like this:
return initializer_list<Y>{};Of course, one of the other purposes of uniform initialization is to not have to type out typenames so much, so you can achieve the same effect withreturn {{}};