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