首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么mt19937 m(random_device()())不能编译?

为什么mt19937 m(random_device()())不能编译?
EN

Stack Overflow用户
提问于 2015-12-04 05:14:31
回答 1查看 233关注 0票数 0

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

代码语言:javascript
复制
float getRandomIndex(const vector<float>& 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<float> a{0.9,0.1};
        cout << getRandomIndex(a) << endl;
    }
    return 0;
}

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

代码语言:javascript
复制
float getRandomIndex(const vector<float>& v){
    mt19937 m(random_device()());
    return discrete_distribution<>(v.begin(),v.end())(m);
}

但未能编译:

代码语言:javascript
复制
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()());
          ^
          (

生成一个警告和一个错误。

但我试着

代码语言:javascript
复制
random_device r;
cout << r() << endl;

代码语言:javascript
复制
cout << random_device()() << endl;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-04 05:26:10

最烦人的解析再次出击!在本例中,random_device()()部件被解析为一个函数,返回一个返回random_device的函数。在这种情况下,代码可以创建一个临时变量,也可以声明一个函数。编译器被迫假定它是一个函数声明。

您可以用大括号或额外的括号修复它。

代码语言:javascript
复制
m(random_device{}()) //uniform initialization syntax, will work
m((random_device()())) //extra parenthesis, also will work
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34081343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档