C++ 为什么param_类型构造函数对于随机分布是显式的?

C++ 为什么param_类型构造函数对于随机分布是显式的?,c++,c++11,language-lawyer,c++-standard-library,explicit,C++,C++11,Language Lawyer,C++ Standard Library,Explicit,我正在尝试编译此程序(请现场查看): 对此有何解释?而且,考虑到param_type构造函数在标准中是显式的,我如何以简洁优雅的方式实现我想要的呢?请注意,在实践中,每次调用dis时,范围可能不同。因此,在构建时提供一个dis的范围没有帮助。它是显式的,因为它有默认参数。任何接受1个参数的构造函数,如果不打算作为转换构造函数,则应该是显式的 因为标准要求一个构造函数具有两个默认参数,所以所有情况都是显式的。一个改进是强制使用非显式的2参数构造函数、显式的1参数构造函数和非显式的0参数构造函数。但

我正在尝试编译此程序(请现场查看):


对此有何解释?而且,考虑到
param_type
构造函数在标准中是显式的,我如何以简洁优雅的方式实现我想要的呢?请注意,在实践中,每次调用
dis
时,范围可能不同。因此,在构建时提供一个dis的范围没有帮助。

它是显式的,因为它有默认参数。任何接受1个参数的构造函数,如果不打算作为转换构造函数,则应该是显式的

因为标准要求一个构造函数具有两个默认参数,所以所有情况都是显式的。一个改进是强制使用非显式的2参数构造函数、显式的1参数构造函数和非显式的0参数构造函数。但那艘船已经开航了

我们可以解决你的问题

template<class...Args>
struct construct_params_t {
  std::tuple<Args&&...> data;
  construct_params_t(Args&&...args):data(std::forward<Args>(args)...){}

private:
  template<class T, std::size_t...Is>
  T create( std::index_sequence<Is...> ){
    return T( std::get<Is>(std::move(data))... );
  }
public:
  template<class T>
  operator T()&&{
    return create<T>( std::index_sequence_for<Args...>{} );
  }
};
template<class...Args>
construct_params_t<Args...> construct_from(Args&&...args) {
  return {std::forward<Args>(args)...};
}
模板
结构构造参数{
std::tuple

这样构造的对象必须是可移动的,并且在RVO省略的情况下,它实际上不应该移动它们


不建议存储
construct_from
的返回值。

在我看来,
param_type
构造函数具有默认参数没有多大意义。通常,需要使用
param_type
只意味着默认值不适用。
construct_from()你设计的是哈基什,是的,我确实喜欢狡猾C++的东西:)我会把它放进我的项目中。但是为了实际使用,我将坚持<代码> DECKET(…):PARAMYMYORE 。
error: converting to 'const std::uniform_int_distribution<long unsigned int>::param_type' from initializer list would use explicit constructor 'std::uniform_int_distribution<_IntType>::param_type::param_type(_IntType, _IntType) [with _IntType = long unsigned int]'
   std::cout << dis(engine, {0, 5}) << std::endl;
std::cout << dis(engine, decltype(dis)::param_type(0, 5)) << std::endl;
template<class...Args>
struct construct_params_t {
  std::tuple<Args&&...> data;
  construct_params_t(Args&&...args):data(std::forward<Args>(args)...){}

private:
  template<class T, std::size_t...Is>
  T create( std::index_sequence<Is...> ){
    return T( std::get<Is>(std::move(data))... );
  }
public:
  template<class T>
  operator T()&&{
    return create<T>( std::index_sequence_for<Args...>{} );
  }
};
template<class...Args>
construct_params_t<Args...> construct_from(Args&&...args) {
  return {std::forward<Args>(args)...};
}
int main() {
  std::random_device engine;
  std::uniform_int_distribution<size_t> dis;
  std::cout << dis(engine, construct_from(0, 5)) << std::endl;
}