Какой конструктор следует вызывать в следующем коде и почему?
struct S
{
int i;
S() = default;
S(void *) : i{1} { ; }
};
S s{{}};
Если я использую clang
(из внешней линии), вызывается вторая.
Если второй конструктор закомментирован, то S{{}}
все еще является допустимым выражением, но (я полагаю) в этом случае вызывается move-constructor из созданного по умолчанию экземпляра S{}
.
Почему конструктор преобразования имеет приоритет над значением по умолчанию в самом первом случае?
Цель такой комбинации конструкторов S
заключается в сохранении ее свойства std::is_trivially_default_constructible_v< S >
, за исключением конечного набора случаев, когда он должен быть инициализирован определенным образом.