is_constructible и is_destructible не зависит от объявлений друзей

Clang и GCC, кажется, не в чести friend декларации при оценке std::is_constructible а также std::is_destructible,

Что касается `is_constructible, cppreference.com говорит:

Проверки доступа выполняются как будто из контекста, не связанного с T и любым из типов в Args. Учитывается только действительность непосредственного контекста определения переменной.

(Сайт не объясняет, как is_destructible имеет дело с проверками доступа, но модификаторами доступа делать повлиять на поведение is_destructible в общем, поэтому я ожидаю, что это будет работать так же, как is_constructible.)

Поэтому мне кажется, что этот код должен не компилировать, так как в непосредственный контекст проверки конструктор и деструктор являются доступно, что подтверждается созданием локальной переменной:

class Private
{
Private() {}
~Private() {}

friend class Friend;
};

class Friend
{
public:
Friend()
{
// Both of these should fire, but they do not.
static_assert(
!std::is_constructible<Private>::value,
"the constructor is public");
static_assert(
!std::is_destructible<Private>::value,
"the destructor is public");
// There is no error here.
Private p;
}
};

…но Coliru компилирует его без ошибок (используя GCC или Clang).

Это ошибка (или, по крайней мере, несоответствие) в и то и другое компиляторы, или cppreference.com искажает стандарт, или я неправильно понимаю утверждение cppreference.com?

7

Решение

Это именно то, что

Проверки доступа выполняются как будто из контекста, не связанного с T а также
любой из типов в Args,

говорит. «Друг T«по определению не» не имеет отношения к T».

«непосредственный контекст» это термин искусства, но в любом случае предложение говорит о непосредственном контексте определения гипотетической переменной, а не об использовании is_constructible,

Было бы безумием сделать is_constructible проверить контекстно-зависимый; это будет означать, что тот же тип, is_constructible<T, Args...>, имеет разные базовые классы в разных контекстах.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector