Код: Выделить всё
template
void f(T t) {
t.T::~T(); // #1 should this compile?
t.T::m(); // #2 should this compile?
}
struct T { ~T() {} void m(){}}; // note named like the typename parameter
struct U : private T { ~U() {} void m(){}}; // note inherits from T
int main()
{
f(U{});
}
Но я попробовал это на компиляторах, используя Godbolt https://godbolt.org/z/3kg8m5xvb, и поведен. /> На кланге это называет деструктор u , но он пытается вызвать базовую функцию члена :: t :: m () вместо :: u :: m () , что приводит к ошибке компиляции на #2.
gcc. Что соответствует моим ожиданиям.
ошибки MSVC на обеих строках, говоря, что он не может получить доступ к частной базе `:: t` destructor и функции частного члена` :: t :: f () `.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... ber-access
Мобильная версия