【发布时间】:2019-12-09 04:44:54
【问题描述】:
<random> 标头在非常奇怪的情况下出现访问冲突。这是编译器错误吗?代码如下:
#include <random>
class Foo {
public:
std::random_device rd;
std::mt19937_64 mt;
std::uniform_int_distribution<int> dist;
Foo();
};
Foo::Foo() : mt(rd()) {
dist = std::uniform_int_distribution<int>(0, 1);
}
int main() {
Foo foo;
int a[2];
int b[2] = { 0 };
for (int i = 0; i < 2; i++) {
int c = foo.dist(foo.mt);
a[0] = b[c];
b[c] = b[0];
}
}
如果我将 for 循环替换为以下内容,则代码可以正常工作而不会违反访问权限!
{
int c = foo.dist(foo.mt);
a[0] = b[c];
b[c] = b[0];
}
{
int c = foo.dist(foo.mt);
a[0] = b[c];
b[c] = b[0];
}
这仅适用于 x64 版本,我从一个“空项目”开始。对我来说,这似乎是一个错误。我错过了什么吗?
【问题讨论】:
-
“这是编译器错误”这个问题的答案是“几乎可以肯定不是”。
-
你不好奇
c的值可能是多少吗? -
显然是编译器错误...报告它:帮助 -> 发送反馈 -> 报告问题...
-
我在 Visual Studio 2019 中重现了 x64 发布模式下的崩溃。版本 16.1.3
-
在 Visual Studio 2017 版本 15.9.11 中复制。在类似条件下来自 cppref 的示例效果很好 en.cppreference.com/w/cpp/numeric/random/…
标签: c++ visual-studio visual-studio-2019