Ho quelle classi:
#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;
}
Durante la compilazione, a_mnon è costruibile di default ma lo aè.
Quando si cambia Cin:
struct C {
int i;
};
va tutto bene.
Testato con Clang 9.0.0.
C() {}esso funziona anche.
static_assertin Afallisce, ma se invece di default costruisci un Tinterno di A(es. Metti un membro T t;lì), funziona tutto bene. Un'incoerenza tra ciò che ti dice la caratteristica del tipo e ciò che è effettivamente possibile ...
const int x;non è valido senza un inizializzatore, semplicemente a causa constdel comportamento di inizializzazione e di alcuni tipi incorporati e alcuni storia)