c++使用未命名对象作为构造函数的实参的歧义问题

问题发生在使用c++随机数生成器时,如下代码:

#include <iostream>
#include <random>

int main()
{
    std::default_random_engine x(std::random_device()());// Error
    std::uniform_int_distribution<int> ud(0, 99);

    for (int i = 0; i < 20; i++)
        std::cout << ud(x) << '\n';

    return 0;
}

代码注释Error的那一行,本意是使用random_device()创建未命名对象,并调用该未命名对象的operator(),以operator()的返回的随机数作为随机数引擎x的构造函数的实参,以初始化它,可却得到编译错误。

原因是这种写法是有歧义的,编译器会以以下方式解释注释Error的那一行:
声明一个函数,函数名为x,返回值类型为std::default_random_engine,形参为std::random_device()(),进而引发编译错误。

修改办法:

使用如下任意一种方式改写这一行:

std::default_random_engine x((random_device()()));// 额外增加一对括号
std::default_random_engine x(random_device{}());  // 使用initializer_list初始化random_device未命名对象
std::default_random_engine x{random_device()()};  // 使用initializer_list初始化x
std::default_random_engine x{random_device{}()};  // 二者均使用initializer_list初始化

正确代码:
#include <iostream>
#include <random>

using std::random_device;

int main()
{
    std::default_random_engine x(random_device{}());
    std::uniform_int_distribution<int> ud(0, 99);

    for (int i = 0; i < 20; i++)
        std::cout << ud(x) << '\n';

    return 0;
}

更详细的解释请参考Wiki/Most_vexing_parse

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值