c++ - 通过函数传递随机引擎 - 为什么不同的编译器表现不同

标签 c++ c++11

为了方便说明这个问题,我做了如下极简代码。这些代码看起来很无辜,但结果却令人惊讶!我在我的 Mac 和 PC 上尝试了不同的编译器。 gcc 看起来不错,但 clang 提供了不正确的结果。我的猜测是这可能是一些未定义的行为。 Mac 结果显示非随机数的重复模式。为什么会这样?

代码如下

#include <iostream>
#include<random>
using namespace std;

class FillUpX{
public:
    FillUpX(default_random_engine eng):generator{eng}{};
    void printValue(){
        for(int i=0;i<10;++i){
            cout << rnorm(generator) << endl;
        }
    }

private:
    default_random_engine & generator;
    std::normal_distribution<> rnorm{0,1};
};


int main(){

    unsigned seed=10;
    std::default_random_engine gen{seed};


    FillUpX fhd(gen);
    fhd.printValue();

   return 0;
}

这里是输出

-0.361197
1.67039
-0.361197
1.67039
-0.361197
1.67039
-0.361197
1.67039
-0.361197
1.67039

最佳答案

问题出在你的构造函数中:

FillUpX(default_random_engine eng):generator{eng}{};

按值获取引擎,然后保存对它的引用。一旦构造函数返回,该对象当然会被破坏,使您的引用无效。

关于c++ - 通过函数传递随机引擎 - 为什么不同的编译器表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51447362/

相关文章:

c++ - 为什么类内初始化器只能使用 = 或 {}?

c++ - 如何在 C++ 中模拟模板化的 std::function

c++ - 算术运算符(+)运算符是否会检查返回类型和传递参数?

c++ - 为什么添加对右值引用的引用不是错误?

c++ - 生成字符串的所有可能的唯一子串

C++ 模板类特化 : why do common methods need to be re-implemented

c++ - 如何使用相同的迭代器获取列表的上一个元素?

c++ - 是否允许将 std::vector 的元素插入到同一 vector 中?

c++ - 从 C++11 中的回调函数终止线程

c++ - 引用初始化表格