over.match.ctor говорит: «Для прямой инициализации или инициализации по умолчанию, которая не находится в контексте инициализации копирования, все функции-кандидаты являются конструкторами класса инициализируемого объекта. Для инициализации копирования функции-кандидаты все конвертирующие конструкторы этого класса. Список аргументов - это список выражений или выражение присваивания инициализатора. " Это означает, что мы рассматриваем только конвертирующие конструкторы.

код прекрасно компилируется с GCC 5.X, MSVC, но GCC 6.X выдает ошибку:

"преобразование в 'a' из списка инициализаторов будет использовать явный конструктор 'a :: a ()'"лязг"выбранный конструктор явно в инициализации копирования".

Удалениеexplicit или меняется наa c{} решает проблему, но мне любопытно, почему это так работает.

class a
{
public:
    explicit a () {}
};
struct b
{
    a c;
};

int main() {
    b d{};
}

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

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