受保护的变量命名和标准

时间:2016-08-11 09:03:39

标签: c++ c++11

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

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

1 个答案:

答案 0 :(得分:10)

作为参考,列出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;