在§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 回答
阅读说明书中的以下段落(见上面的引文); C§26.5.1.6/9:
哪里;
P
是嵌入式param_type
和D
是随机数分布 .并给出(§26.5.8.3.1);
可以说
bernoulli_distribution
的构造函数的要求是:来自单个参数的显式构造
该单个参数的类型为
double
参数的默认参数为
0.5
因此,嵌入的
param_type
应该是相同的,因为它们将具有"the same requirements",如§26.5.1.6/ 9所规定的那样 . 给它形式;虽然我承认,这一措辞最初可能不是很清楚 . 我怀疑libstdc实现对规范有更准确的解释,并且MSVC实现可能不正确 .
Update
据报道,微软已经解决了这个问题,当它可用时,请注意VS 14 RTM .