initializer_list и разрешение перегрузки конструктора по умолчанию

#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;
}

Это печатает "бу". Почему это не распечатывает "yay"?

Есть ли в любом случае дифференцировать следующие две конструкции:

X()X{}

или же

return X();return {};

или же

void g(const X&)
g(X())g({})

Благодарю.

Ответы на вопрос(4)

Ваш ответ на вопрос