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

Why is bernoulli_distribution::param_type's constructor explicit?

本文关键字:构造函数 aram bernoulli distribution 为什么 type      更新时间:2023-10-16

在§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;
};

从而不允许编译上面的代码。

他们选择明确构造函数的原因是什么?

阅读规范中的以下段落(在上面的引号后面);C++§26.5.1.6/9:

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

其中;

  • CCD_ 9是嵌入的CCD_
  • CCD_ 11是随机数分布

并给出(§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实现可能不正确。

更新

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