#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中是公开的?
这个错误吗? 如果是的话,下一个版本的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.
问:使用public
数据成员有什么理由或优势吗?
答案 0 :(得分: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
的情况之一,所以如果预期这样的函数,暴露内部可能是最好的(读取:最不好)的事情。
所以我不会太快说它是一个错误。也就是说,这是一个值得怀疑的设计决定,我当然不会建议任何人复制这种风格。