为什么std :: basic_string的成员在VS2010中是公共的?

Khu*_*hid 12 c++ visual-studio-2010 visual-studio-2012

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

}
Run Code Online (Sandbox Code Playgroud)

为什么std::basic_stringVS2010中的非静态成员是公开的?

这个错误吗?如果是的话,下一个版本的visual studio(vs2012和vs2013)怎么样?

编辑:我只测试其他容器,并且...有趣的vector和unique_ptr的非静态成员也是公共的.

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


std::unique_ptr< int > u;

u._Myptr = 0; // well compiled.
Run Code Online (Sandbox Code Playgroud)

问:使用public数据成员有什么理由或优势吗?

小智 13

这不是影响一致性的因素.标准C++程序不允许_Mysize在任何上下文中使用,甚至不测试任何标准库类型上是否存在此类成员.无论如何,这样做意味着标准对程序的行为没有任何要求.

2.11标识符[lex.name]

3此外,一些标识符保留供C++实现和标准库(17.6.4.3.2)使用,否则不得使用; 无需诊断.

17.6.4.3.2全局名称[global.names]

1始终为实现保留某些名称和功能签名集:

- 每个包含双下划线__或以下划线开头后跟大写字母(2.12)的名称保留给实现以供任何使用.

在某些情况下,它可能使MS更容易在初始发布时不存在的其他标头中编写高度优化的特殊非成员函数,而无需修改原始标头.这是少数情况下直接访问类的内部是可辩护的情况之一,也是无法声明新函数的情况之一friend,所以如果预期这样的函数,暴露内部可能是最好的(阅读:最不好的) 要做的事.

所以我不会太快就称它为bug.也就是说,这是一个值得怀疑的设计决定,我当然不会建议任何人复制这种风格.