J'ai ces cours:
#include <type_traits>
template <typename T>
class A {
public:
static_assert(std::is_default_constructible_v<T>);
};
struct B {
struct C {
int i = 0;
};
A<C> a_m;
};
int main() {
A<B::C> a;
}
Lors de la compilation, a_mn'est pas constructible par défaut mais l' aest.
Lors du passage Cà:
struct C {
int i;
};
tout va bien.
Testé avec Clang 9.0.0.
C() {}ça marche aussi.
static_assertin Aéchoue, mais si vous construisez par défaut un Tintérieur de A(par exemple, mettez un membre T t;là-bas), cela fonctionne très bien. Une incohérence entre ce que le trait de type vous dit et ce qui est réellement possible ...
const int x;n'est pas valide sans initialiseur, uniquement en raison constdu comportement d'initialisation des types intégrés et de certains historique)