【问题标题】:Why members of std::basic_string are public in VS2010?为什么 std::basic_string 的成员在 VS2010 中是公开的?
【发布时间】:2014-04-10 22:12:49
【问题描述】:
#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)怎么样?

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

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


std::unique_ptr< int > u;

u._Myptr = 0; // well compiled.

问:这里有使用public 数据成员的任何理由或优势吗?

【问题讨论】:

  • 我不认为这是一个错误,但它确实让我也想到了"Why?"。 +1!
  • 我也可以确认这在 VS2013 中做同样的事情。
  • 它肯定是一个错误,由于这个类不变量会继续折腾。
  • _Myres in std::string 也是公开的

标签: c++ visual-studio-2010 visual-studio-2012


【解决方案1】:

这不会影响一致性。标准 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 的情况之一,因此如果预期此类函数,公开内部可能是最好的(阅读: 最坏的) 要做的事情。

所以我不会太快将其称为错误。也就是说,这是一个值得商榷的设计决定,我当然不会建议任何人复制这种风格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2021-04-07
    • 2015-11-14
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多