为什么bernoulli_distribution :: param_type的构造函数是显式的?

时间:2014-11-03 12:19:48

标签: c++ c++11 random libstdc++

在§26.5.1.6/ 7中它说:

  

未指定D::param_type是否声明为(嵌套)   类或通过typedef。在本条款26.5中,声明   为方便起见,D::param_type采用typedef的形式   只有博览会。

这似乎表明param_type是实现定义的。特别是对于GCC和Clang,以下内容无法编译:

std::bernoulli_distribution d(0.50);
d.param(0.25);

但对于MSVC 2013,确实如此。在random.h中查找libstdc ++,它显示param_type的构造函数被标记为显式:

struct param_type
{
  typedef bernoulli_distribution distribution_type;

  explicit
  param_type(double __p = 0.5)
  : _M_p(__p)
  {
_GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) && (_M_p <= 1.0));
  }

  double
  p() const
  { return _M_p; }

  friend bool
  operator==(const param_type& __p1, const param_type& __p2)
  { return __p1._M_p == __p2._M_p; }

private:
  double _M_p;
};

因此不允许上面的代码编译。

他们选择使构造函数显式的原因是什么?

1 个答案:

答案 0 :(得分:4)

阅读说明书中的以下段落(见上文引用); C ++§26.5.1.6/9:

  

对于D的每个构造函数,它们采用与分布参数相对应的参数,P应该有一个相应的构造函数符合相同的要求并且在数字,类型和默认值。此外,对于返回与分布参数对应的值的D的每个成员函数,P应具有相同的成员函数,具有相同的名称,类型和语义。

其中;

  • P是嵌入式param_type
  • D是随机数分布。

并给出(§26.5.8.3.1);

explicit bernoulli_distribution(double p = 0.5);

可以认为bernoulli_distribution的构造函数的要求是:

  • 从单个参数显式构建
  • 该单个参数的类型为double
  • 参数的默认参数为0.5

因此,嵌入的param_type应该是相同的,因为它们将具有“相同的要求”,如第26.5.1.6/9节所规定的那样。给它形式;

explicit param_type(double __p = 0.5) { /*...*/ }

虽然我承认,这一措辞最初可能不是很明确。我怀疑libstdc ++实现对规范有更准确的解释,并且MSVC实现可能不正确。

<强>更新

据报道,微软已经解决了这个问题,当它可用时,请注意 VS 14 RTM