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