std::variant<>::get() 无法使用 Apple LLVM 10.0 进行编译
std::variant<>::get() does not compile with Apple LLVM 10.0
我正在玩 C++17 std::variant 类型并尝试为 get()
编译 cppreference example code:
#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&) {}
}
in XCode 10. 我的项目设置为 C++17,但出现编译错误:
Call to unavailable function 'get': introduced in macOS 10.14
和
'bad_variant_access' is unavailable: introduced in macOS 10.14
这在两个方面令人惊讶:如果支持 std::variant
它应该编译并且关于 macOS 10.14 的提示很奇怪,因为我使用的是那个版本并且它与支持的 C++ 无关方言(项目的部署目标是 10.14)。
这是我做错了什么还是 clang 中的错误?
事实证明,项目设置为 macOS 10.14,但不是实际的构建目标,它仍在 10.13 上。一旦我将其还原为继承部署目标,测试代码就开始正常编译了。
考虑到可以安装 XCode 10(以及 LLVM 10.0)并用于在 10.13 上构建 C++17 应用程序,这是一个有趣的转折。
从 macOS 10.14(以及相应的 iOS、tvOS 和 watch OS) 在标准头文件中。这是因为虚拟std::bad_variant_access::what()
方法不是inline
,因此在libc++.dylib
中定义(由OS提供)。
如果您想在旧版 OS 上的应用程序 运行 中使用 std::variant
,只需使用 std::get_if
。在你的例子中:
if (auto* p = std::get_if<int>(&w)) {
// use *p
} else {
// error handling
}
您也可以通过w.index()
and std:: holds_alternative <int>(w)
提前查询。
编辑:
另请参阅我的 与 std::visit
的类似问题(不幸的是,使用不太方便的解决方法)
我正在玩 C++17 std::variant 类型并尝试为 get()
编译 cppreference example code:
#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&) {}
}
in XCode 10. 我的项目设置为 C++17,但出现编译错误:
Call to unavailable function 'get': introduced in macOS 10.14
和
'bad_variant_access' is unavailable: introduced in macOS 10.14
这在两个方面令人惊讶:如果支持 std::variant
它应该编译并且关于 macOS 10.14 的提示很奇怪,因为我使用的是那个版本并且它与支持的 C++ 无关方言(项目的部署目标是 10.14)。
这是我做错了什么还是 clang 中的错误?
事实证明,项目设置为 macOS 10.14,但不是实际的构建目标,它仍在 10.13 上。一旦我将其还原为继承部署目标,测试代码就开始正常编译了。
考虑到可以安装 XCode 10(以及 LLVM 10.0)并用于在 10.13 上构建 C++17 应用程序,这是一个有趣的转折。
从 macOS 10.14(以及相应的 iOS、tvOS 和 watch OS) 在标准头文件中。这是因为虚拟std::bad_variant_access::what()
方法不是inline
,因此在libc++.dylib
中定义(由OS提供)。
如果您想在旧版 OS 上的应用程序 运行 中使用 std::variant
,只需使用 std::get_if
。在你的例子中:
if (auto* p = std::get_if<int>(&w)) {
// use *p
} else {
// error handling
}
您也可以通过w.index()
and std:: holds_alternative <int>(w)
提前查询。
编辑:
另请参阅我的 std::visit
的类似问题(不幸的是,使用不太方便的解决方法)