Только ошибки из непосредственного контекста вызывают «мягкую» ошибку, которая удаляет шаблон функции из набора перегрузки.Компилятор должен создать экземпляр base_type<T>
, прежде чем он сможет оценить sizeof(base_type<T>)
, и любые ошибки, возникающие в результате этого создания, , а не в непосредственном контексте, и могут вызвать серьезные ошибки.
Я не уверенто, что вы действительно пытаетесь сделать, но вы, вероятно, можете сделать это, используя std::enable_if_t<std::is_union_v<T>>
, чтобы отключить перегрузку.Причина, по которой это работает, заключается в том, что создание экземпляра std::enable_if
, которое выполняется первым, не вызывает ошибок;результирующий класс просто не может содержать члена с именем type
.Доступ к type
в * непосредственном контексте .