【问题标题】:Protected variables naming and the standard受保护的变量命名和标准
【发布时间】:2016-12-17 22:15:04
【问题描述】:

我遇到了这个post,其中引入了可迭代队列。 OP 在实现中使用了来自std::queue 的名为c 的受保护变量。

这完全有效吗?这个变量在所有实现中都具有相同的名称吗?换句话说,标准是否明确规定这个变量必须命名为c

【问题讨论】:

标签: c++ c++11


【解决方案1】:

作为参考,std::queue 的确切定义列于here。所以回答

换句话说,标准是否明确规定该变量必须命名为c

是的,就是这种情况(其他容器适配器也类似);

template <class T, class Container = deque<T>>
  class queue {
  protected:
    Container c;
    // ...
  };

但是,一般来说,受保护和私有名称和成员的名称不是标准化的,因为这些类型并非都是为了派生而构建的,并且实现是实现细节(并且不构成公共 API 的一部分);例如std::vector 没有列出任何受保护的名称。

一些std 容器和类确实定义了protected 成员的名称,特别是我想到的 iostreams 库 - 基本上是打算从中派生的类型。


作为跟进 - 所有编译器/库是否都使用 c?似乎至少主流的(libstdc++、libc++ 和 MSVC)是这样。 libstdc++ 的有趣之处在于它在变量上包含了follow comment

/**
 *  'c' is the underlying container.  Maintainers wondering why
 *  this isn't uglified as per style guidelines should note that
 *  this name is specified in the standard, [23.2.3.1].  (Why?
 *  Presumably for the same reason that it's protected instead
 *  of private: to allow derivation.  But none of the other
 *  containers allow for derivation.  Odd.)
 */
_Sequence c;

【讨论】:

  • 如果这在某种意义上是一次编辑事故,我不会感到惊讶:为说明而提供的变量名称意外地成为规范。即使情况并非如此,想象一个标准库实现者可能有同样的想法并将其视为非规范性也不是疯狂的推测。因此,尽管有明显的保证,但我仍然不确定我是否会依赖这一点。无论如何,std::queue 的用法很奇怪且“不正常”。
  • @LightnessRacesinOrbit。可能。 IIRC,在 TR1 中,std::array 有一个数据成员的名称,但有一个相关的评论,大意是 T elems[N]; // Exposition only。我不确定std::queue 中变量c 的动机是什么,它似乎早在C++98 就已经存在了。
  • 我也喜欢他们确实有一个风格指南,要求事情变得“丑化”
  • @LightnessRacesinOrbit 这在标准库的实现中很常见,因此实现只使用为实现保留的名称,从而避免与应用程序使用的名称发生冲突。如果实现使用了像length 这样的漂亮名称,那么应用程序可以通过执行#define length 0 来破坏实现。
  • @LightnessRacesinOrbit 如果您阅读链接的源代码,您会看到所有内部标识符都以一个下划线和大写字母或两个下划线开头。 (这些是为实现保留的标识符。)所以很明显,这就是他们所说的丑化的意思。如果你搜索风格指南,你可以找到a formal definition of uglification
猜你喜欢
  • 1970-01-01
  • 2016-03-08
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多