问题发生在使用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