Подтвердить что ты не робот

Почему члены std:: basic_string являются общедоступными в VS2010?

#include <iostream>
#include <string>
int main()
{
    std::string s;
    s._Mysize = 7;  // Well compiled !!!
    std::cout << s.size() << '\n'; // prints 7   !!!

}

Почему нестатические члены std::basic_string являются общедоступными в VS2010?

Это ошибка? Если да, то как насчет следующей версии визуальной студии (vs2012 и vs2013)?

EDIT: Я просто тестирую другие контейнеры, и... интересные векторные и unique_ptr нестатические члены также являются общедоступными.

std::vector<char> v;
v._Myfirst = (char*)2; // Well Compiled.


std::unique_ptr< int > u;

u._Myptr = 0; // well compiled.

В: Есть ли причина или преимущество использования элементов данных public?

4b9b3361

Ответ 1

Это не то, что влияет на соответствие. Стандартным программам на С++ не разрешается использовать _Mysize в любом контексте, даже не проверять, существует ли такой член в любом стандартном типе библиотеки. Тот факт, что вы это делаете, в любом случае означает, что стандарт не налагает никаких требований на поведение вашей программы.

2.11 Идентификаторы [lex.name]

3 Кроме того, некоторые идентификаторы зарезервированы для использования реализацией С++ и стандартными библиотеками (17.6.4.3.2) и не должны использоваться иначе; диагностика не требуется.

17.6.4.3.2 Глобальные имена [global.names]

1 Определенные наборы имен и сигнатур функций всегда зарезервированы для реализации:

- Каждое имя, содержащее двойной знак подчеркивания __ или начинающийся с символа подчеркивания, за которым следует заглавная буква (2.12), зарезервировано для реализации для любого использования.

В некоторых случаях это может облегчить для MS создание высокооптимизированных специальных функций, не являющихся членами, в дополнительных заголовках, которые не существовали во время начальной версии, без изменения исходных заголовков. Это один из немногих случаев, когда прямой доступ к внутренним классам является оправданным, а также один из случаев, когда новые функции не могут быть объявлены friend, поэтому, если такие функции ожидаются, разоблачение внутренних элементов может быть лучшим (read: наименее плохая) вещь, которую нужно сделать.

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