std::variant<>::get() 不能使用 Apple LLVM 10.0 编译



我正在使用 C++17 std::variant 类型,并尝试为get()编译 cppreference 示例代码:

#include <variant>
#include <string>
int main()
{
std::variant<int, float> v{12}, w;
int i = std::get<int>(v);
w = std::get<int>(v);
w = std::get<0>(v); // same effect as the previous line
//  std::get<double>(v); // error: no double in [int, float]
//  std::get<3>(v);      // error: valid index values are 0 and 1
try {
std::get<float>(w); // w contains int, not float: will throw
}
catch (std::bad_variant_access&) {}
}

在XCode 10中。我的项目设置为 C++17,但出现编译器错误:

调用不可用函数"get":macOS 10.14 中引入

"bad_variant_access"不可用:在 macOS 10.14 中引入

这在两个方面令人惊讶:如果支持std::variant,它应该编译,并且关于macOS 10.14的提示很奇怪,因为我使用的是该版本并且与支持的C++方言无关(项目的部署目标是10.14(。

这是我做错了还是叮当声中的错误?

所有可能引发std::bad_variant_accessstd::variant功能在标准头文件中都标记为从 macOS 10.14(以及相应的 iOS、tvOS 和 watchOS(开始可用。这是因为虚拟std::bad_variant_access::what()方法不是inline的,因此在libc++.dylib(由操作系统提供(中定义。

如果要在旧操作系统上运行的应用程序中使用std::variant,只需使用std::get_if.在您的示例中:

if (auto* p = std::get_if<int>(&w)) {
// use *p
} else {
// error handling
}

您也可以提前与w.index()std:: holds_alternative <int>(w)联系。

编辑: 另请参阅我对std::visit类似问题的回答(不幸的是,使用了一个不太方便的解决方法(

事实证明,该项目被设置为 macOS 10.14,但不是实际的构建目标,它仍然是 10.13。一旦我将其还原为继承部署目标,测试代码就开始编译良好。

这是一个有趣的转折,因为XCode 10(以及LLVM 10.0(可以安装并用于在10.13上构建C++17应用程序。

相关内容

  • 没有找到相关文章

最新更新