В следующем коде (https://wandbox.org/permlink/rA7lnXM6eQR4JhSM)
#include <type_traits>
template <typename T>
struct Identity : public T {};
class Something {
public:
Something() = default;
Something(const Something&) = delete;
Something(Something&&) = default;
Something& operator=(const Something&) = default;
Something& operator=(Something&&) = default;
template <
typename T,
typename U = std::decay_t<T>,
std::enable_if_t<Identity<
std::is_constructible<U, T&&>>::value>* = nullptr>
explicit Something(T&&) {};
};
int main() {
static_cast<void>(std::is_constructible<Something, const Something&>{});
}
я получаю следующую ошибку
error: base class has incomplete type
struct Identity : public T {};
~~~~~~~^
Ошибка исчезает, когда я удаляю косвенное обращение с помощью Identity
в ограничении этого (https://wandbox.org/permlink/MFJCHUzeKnS4yR0d)
template <
typename T,
typename U = std::decay_t<T>,
std::enable_if_t<
std::is_constructible<U, T&&>::value>* = nullptr>
explicit Something(T&&) {};
Насколько я понимаю, проблема здесь заключалась в том, что мы пытаемся создать экземпляр std::is_constructible
, который затем создает экземпляр конструктора для Something
, который затем, в свою очередь,создает экземпляр std::is_constructible
и т. д.
Но почему ошибка исчезает, когда я пытаюсь скомпилировать ее без Identity
? И почему она выдает ошибку, когда я использую Identity
?