首页 文章

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

提问于
浏览
1

在§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 回答

  • 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 应该是相同的,因为它们将具有"the same requirements",如§26.5.1.6/ 9所规定的那样 . 给它形式;

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

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

    Update

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

相关问题