Visual Studio在逐行调试c++代码时,调试到使用类似auto [ l , r ] = v这样的语法的语句时就会中止并显示:
未找到源,未找到 predefined C++ types (compiler internal).

但加上引用后(auto& [ l , r ] = v)就不会有这个问题
Visual Studio在逐行调试c++代码时,调试到使用类似auto [ l , r ] = v这样的语法的语句时就会中止并显示:
未找到源,未找到 predefined C++ types (compiler internal).

但加上引用后(auto& [ l , r ] = v)就不会有这个问题
晚上好🌙🌙🌙
本答案参考通义千问
你遇到的问题是 Visual Studio 在调试 C++ 代码时,使用 auto [l, r] = v; 这样的结构化绑定(Structured Bindings)语法时出现“未找到源,未找到 predefined C++ types (compiler internal)”的错误。这个问题通常出现在 Visual Studio 的调试器无法正确解析结构化绑定语法 的情况下。
auto [l, r] = v;) 是 C++17 引入的新特性。auto [l, r] = v; 时,编译器会生成一些内部类型,而调试器可能无法识别这些类型,导致报错。auto& [l, r] = v; 时,编译器生成的类型更接近标准类型,因此调试器可以正确解析,不会报错。以下是几种解决方法,按优先级排序:
auto& 而不是 autoauto [l, r] = v; 改为 auto& [l, r] = v;。// 原始代码(可能导致错误)
auto [l, r] = v;
// 修改后
auto& [l, r] = v;
注意:这仅适用于你不需要拷贝容器内容的情况。如果你需要拷贝值,应使用
const auto&或auto。
警告:这种方法可能影响调试器的其他功能,不建议作为首选方案。
std::tie 替代结构化绑定(可选)int l, r;
std::tie(l, r) = v;
注意:这种方式不如结构化绑定简洁,且需要显式声明变量。
| 方法 | 推荐程度 | 说明 |
|------|-----------|------|
| 升级 Visual Studio | ⭐⭐⭐⭐⭐ | 最佳解决方案,彻底解决问题 |
| 使用 auto& | ⭐⭐⭐⭐ | 快速修复,无需升级 |
| 禁用调试信息 | ⭐⭐ | 风险较高,不推荐 |
| 使用 std::tie | ⭐⭐ | 兼容性好,但不够简洁 |
你遇到的问题是因为 Visual Studio 的调试器对 C++17 的结构化绑定支持不完整,尤其是在旧版本中。最推荐的解决方案是升级到 Visual Studio 2022 或更高版本,如果暂时无法升级,使用 auto& [l, r] = v; 可以绕过此问题。
如果你有更多关于调试器配置或 C++17 特性的疑问,欢迎继续提问!