Форум » C/C++ » Баг компилятора clang HEAD 10.0.0 относительно определения дружественной функции в классе. » Ответить

Баг компилятора clang HEAD 10.0.0 относительно определения дружественной функции в классе.

Сыроежка: Компилятор сlang HEAD 10.0.0 имеет интересный баг при определении дружественной функции в классе. Если объявить один класс дружественным другому, а затем в этом дружественном классе определить дружественную ему функцию, то эта функция транзитивно будет иметь доступ к членам класса, который предоставил изначально дружбу. Вот демонстрационная программа, которая успешно компилируется компилятором clang HEAD 10.0.0 [pre2] #include <iostream> class A { friend class B; int m; }; class B { friend void f( A *p ) { p->m = 10; } }; int main() { }[/pre2] Однако, если определить эту функцию вне класса, как показано ниже [pre2] #include <iostream> class A { friend class B; int m; }; class B { friend void f( A *p ); }; void f( A *p ) { p->m = 10; } int main() { }[/pre2] то в этом случае компилятор уже сообщит об ошибке, что функция f не имеет доступа к приватным членам класса A. [pre2] rog.cc:14:21: error: 'm' is a private member of 'A' void f( A *p ) { p->m = 10; } ^ prog.cc:6:9: note: implicitly declared private here int m; ^ 1 error generated. [/pre2] Чтобы не было сомнений, что это баг компилятора, приведу цитату из стандарта C++ 17 (14.3 Friends) [quote]10 Friendship is neither inherited nor transitive[/quote]

Ответов - 0



полная версия страницы