В какой момент член базового класса считается скрытым? ⇐ C++

Программы на C++. Форум разработчиков
Anonymous
В какой момент член базового класса считается скрытым?

Сообщение Anonymous »

Clang отклоняет следующую программу:
struct g { static constexpr bool b = true; };
struct h : g { static constexpr bool b = b; }; // clang nope, gcc ok, msvc ok
static_assert(h::b);

Я считаю, что Clang пытается инициализировать переменную b самостоятельно. Но поскольку переменная b все еще не инициализирована, чтение из нее приводит к неопределенному поведению, которое недопустимо в константном выражении.
Однако GCC и MSVC принимают эту программу . Предлагая просто разрешить значение инициализации h::b из его базового члена g::b. Возникает вопрос: в какой момент h::b начинает скрывать свой базовый элемент g::b?
Of конечно, уточнение b могло бы полностью устранить это несоответствие, но это не является целью данного вопроса.
Демо

Сообщение об ошибке Clang:
:2:38: error: constexpr variable 'b' must be initialized by a
constant expression
2 | struct h : g { static constexpr bool b = b; };
| ^ ~
:2:42: note: read of object outside its lifetime is not allowed in a
constant expression
2 | struct h : g { static constexpr bool b = b; };
| ^


Подробнее здесь: https://stackoverflow.com/questions/790 ... -be-hidden

Вернуться в «C++»