Исходя из моего ответа на Динамический массив объектов в C++ и в качестве продолжения на Что такое правила о использовать подчеркивание в идентификаторе C++?: видимо, имена, начинающиеся с _
, за которыми следует заглавная буква, зарезервированы в глобальном пространстве имен.
17.4.3.2.1 Глобальные имена [
lib.global.names
]Определенные наборы имен и сигнатур функций всегда зарезервированы для реализации:
- Каждое имя, которое содержит двойное подчеркивание (
__
) или начинается с подчеркивания, за которым следует заглавная буква (2.11), зарезервировано реализацией для любого использования.- Каждое имя, начинающееся со знака подчеркивания, зарезервировано реализацией для использования в качестве имени в глобальном пространстве имен.165
165) Такие имена также зарезервированы в пространстве имен
::std
(17.4.3.1).
В моем ответе на первый вопрос у меня был класс, который выглядел так
class A
{
private:
vector<int> _Ints;
}
В комментариях мне сказали, что идентификатор _Ints
вызывает неопределенное поведение, поскольку это зарезервированное имя. Однако, согласно последнему проекту стандарта, поиск имени переменной-члена происходит по следующему правилу:
3.4.3.1 Члены класса [
class.qual
]Если вложенный-спецификатор-имени для квалифицированного-идентификатора назначает класс, имя, указанное после вложенного-имени-спецификатора, ищется в область применения класса (10.2), за исключением случаев, перечисленных ниже. Имя должно представлять одного или нескольких членов этого класса или одного из его базовых классов.
Для меня это означает, что никакая переменная-член никогда не может быть частью глобального пространства имен, поскольку ее областью действия является класс.
А теперь вопрос:
Правильно ли я понимаю, что переменные-члены никогда не будут нарушать правило зарезервированных имен реализации, поскольку они не находятся в глобальном пространстве имен? Если я не прав, может ли кто-нибудь объяснить мое непонимание правила поиска?