为什么 bernoulli_distribution::p aram_type 的构造函数是显式的?
Why is bernoulli_distribution::param_type's constructor explicit?
在§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可用时,请注意它。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 奇怪的构造函数行为