On-line: гостей 1. Всего: 1 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 15.12.14 21:34. Заголовок: Различие в объявлении friend классов в стандартах C++ 2003 и 2011 и баг компилятора GCC 4.8.1


Случайно для себя обнаружил следующее различие в описании дружественных классов (friend classes) в стандартах C++ 2003 и C++ 2011.

В разделе "11.4 Friends" стандарта C++ 2003 в параграфе №2 написано следующее:


 цитата:
This also means that private and protected type names from the class granting friendship can be used in the base-clause of a nested class of the friend class. However, the declarations of members of classes nested within the friend class cannot access the names of private and protected members from the class granting friendship. Also, because the base-clause of the friend class is not part of its member declarations, the base-clause of the friend class cannot access the names of the private and protected members from the class granting friendship.



И затем приводится пример:
 
class A {
class B { };
friend class X;
};

class X : A::B { // ill-formed: A::B cannot be accessed
// in the base-clause for X
A::B mx; // OK: A::B used to declare member of X
class Y : A::B { // OK: A::B used to declare member of X
A::B my; // ill-formed: A::B cannot be accessed
// to declare members of nested class of X
};
};

Обратите внимание на два комментария, которые начинаются со слов ill-formed

Теперь обратимся к стандарту C++ 2011. В разделе "11.3 Friends" в параграфе №2 уже написано следующее


 цитата:
2 Declaring a class to be a friend implies that the names of private and protected members from the class granting friendship can be accessed in the base-specifiers and member declarations of the befriended class.


И тот же самый пример, что приведен выше, содержит уже другие комментарии:
 
class A {
class B { };
friend class X;
};

struct X : A::B { // OK: A::B accessible to friend
A::B mx; // OK: A::B accessible to member of friend
class Y {
A::B my; // OK: A::B accessible to nested member of friend
};
};


Как видно, новый стандарт разрешает использовать в объявлении базовых членов и вложенных членов данных класса закрытые и защищенные члены класса, являющегося дружественным к данному классу,

Если использовать on-line компилятор Microsoft , то приведенный пример из стандарта компилируется успешно. Однако если тот же самый пример попробовать скомпилировать с помощью on-line компилятора GCC 4.8.1 , то будет выдано следующее сообщение об ошибке:
 
prog.cpp:5:11: error: ‘class A::B’ is private
class B { };
^
prog.cpp:9:14: error: within this context
class X : A::B
^


То есть GCC 4.8.1 не позволяет использовать закрытые члены дружественного класса в объявлении базовых членов.



Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 15
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет