You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio 2022中使用std::random_device报“引用已删除函数”错误

问题分析与解决

错误原因

错误C2280提示尝试引用std::random_device已删除的拷贝构造函数,但你提供的代码里并没有显式拷贝random_device对象。这个问题出在Visual Studio 2022的项目设置或编译器对C++标准的支持上:

  • 若项目未启用足够高的C标准版本(std::random_device是C11引入的特性),编译器可能会误判代码行为。
  • 若未开启严格符合模式,VS的编译器行为可能触发不必要的隐式拷贝检测。

解决方案

1. 确认C++标准版本

右键项目 → 属性 → 配置属性 → C/C++ → 语言 → C标准,选择**ISO C17标准**或更高版本(如/std:c++20)。

2. 开启严格符合模式

同样在项目属性的C/C++ → 语言选项中,将符合模式设置为是(/permissive-),强制编译器遵循C++标准规范。

3. 简化代码避免潜在问题

可以直接在初始化std::mt19937时临时创建std::random_device,无需单独声明变量,代码更简洁且规避任何可能的隐式拷贝风险:

#include <iostream>
#include <random>

int main() {
    auto gen = std::mt19937{std::random_device{}()};
    auto dist = std::uniform_int_distribution<std::uint16_t>{0, 255};
    for (int i = 0; i < 10; i++) {
        std::cout << dist(gen) << "\n";
    }

    return 0;
}

为什么VS Code能正常运行?

VS Code默认使用的编译器(如MinGW、Clang)对C++标准的支持更贴近规范,且默认设置通常已启用足够高的标准版本,因此不会触发该错误。

内容的提问来源于stack exchange,提问作者DrParanoya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:56:01