В какой момент член базового класса считается скрытым?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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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