当前位置:  开发笔记 > 编程语言 > 正文

为什么mt19937 m(random_device()())无法编译?

如何解决《为什么mt19937m(random_device()())无法编译?》经验,为你挑选了1个好方法。

我想创建一个函数,它根据元素的值随机返回向量索引作为概率:

float getRandomIndex(const vector& v){
    random_device r;
    mt19937 m(r());
    return discrete_distribution<>(v.begin(),v.end())(m);
}

int main(){
    for(int i=0;i<10;i++){
        vector a{0.9,0.1};
        cout << getRandomIndex(a) << endl;
    }
    return 0;
}

现在我想减少行号,所以尝试将函数重写为:

float getRandomIndex(const vector& v){
    mt19937 m(random_device()());
    return discrete_distribution<>(v.begin(),v.end())(m);
}

但编译失败:

error: function cannot return function type 'std::__1::random_device ()'
mt19937 m(random_device()());
                       ^
warning: parentheses were disambiguated as a function declaration [-Wvexing-parse]
mt19937 m(random_device()());
         ^~~~~~~~~~~~~~~~~~~
note: add a pair of parentheses to declare a variable
mt19937 m(random_device()());
          ^
          (

生成1个警告和1个错误.

但我会尝试

random_device r;
cout << r() << endl;

cout << random_device()() << endl;

它们似乎具有相同的功能,为什么我不能将变量r替换为mt19937中立即创建的random_device?



1> Weak to Enum..:

在最让人头疼的解析再次罢工!在这种情况下,看起来random_device()()部件被解析为返回函数返回a的函数random_device.在这种情况下,代码可以创建临时变量,也可以声明函数.编译器被迫假设它是一个函数声明.

您可以使用大括号或额外括号来修复它.

m(random_device{}()) //uniform initialization syntax, will work
m((random_device()())) //extra parenthesis, also will work

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有