Код: Выделить всё
#include
struct A {
int i, j;
constexpr A() : i((std::construct_at(&j, 2), j-1)) {}
};
constexpr A a{};
static_assert(a.i == 1);
static_assert(a.j == 2);
на практике я вижу, что все GCC, MSVC и Clang принимают программу. Онлайн демонстрация: https://gcc.godbolt.org/z/yzeoppj96
Но Clang выдает предупреждение:
:5:50: warning: field 'j' is uninitialized when used here [-Wuninitialized]
5 | constexpr A() : i((std::construct_at(&j, 2), j-1)) {}
| ^
< /code>
Это выглядит противоречит, поскольку чтение ненициализированных значений в постоянных выражениях должно привести к жесткому отказу. Программа хорошо сформирована, а диагностика просто неправильная?
Подробнее здесь: https://stackoverflow.com/questions/795 ... her-member