Ответ 1
Доступ к неинициализированным переменным - это undefined поведение, и диагностика не требуется. Это означает, что вы можете получить предупреждение для b.k
(MSVС++), для a.k
(g++) или для ни (Clang).
Стандартные кавычки:
12.6.2 Инициализация баз и членов [class.base.init]
8 В конструкторе без делегирования, если данный нестатический член данных или базовый класс не обозначается идентификатором mem-initializer-id (включая если нет mem-initializer-list, потому что конструктор не имеет ctor-инициализатора), и сущность не является виртуальным базовым классом абстрактный класс (10.4), то
[связка неприменимых предложений]
- в противном случае объект инициализируется по умолчанию (8.5).
8.5 Инициализаторы [dcl.init]
7 Для инициализации объекта типа T по умолчанию:
[связка неприменимых предложений]
- в противном случае инициализация не выполняется.
В приведенной ниже цитате 12.6.2/8:
struct C {
C() { } // initializes members as follows:
A a; // OK: calls A::A()
const B b; // error: B has no default constructor
int i; // OK: i has indeterminate value // <---------- your code
int j = 5; // OK: j has the value 5
};