Mam te zajęcia:
#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;
}
Podczas kompilacji a_mnie jest domyślnie możliwy do zbudowania, ale ajest.
Przy zmianie Cna:
struct C {
int i;
};
wszystko w porządku.
Testowane z Clang 9.0.0.
C() {}tym też działa.
static_assertw Anie, ale jeśli zamiast domyślnego skonstruować Twewnątrz A(np umieścić człon T t;tam), to działa wszystko jest w porządku. Niespójność między tym, co mówi ci cecha typu, a tym, co jest faktycznie możliwe ...
const int x;to samo zdanie na temat preferencji, jest niepoprawny bez inicjatora, wyłącznie ze względu na constzachowanie inicjalizacji wbudowanych typów i niektórych historia)