在§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;
};
因此不允许上面的代码编译。
他们选择使构造函数显式的原因是什么?
答案 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 。