我正在使用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&) {}
}
在XCode 10中。我的项目设置为C ++ 17,但出现编译器错误:
调用不可用的功能'get':在macOS 10.14中引入
和
'bad_variant_access'不可用:在macOS 10.14中引入
有两种令人惊奇的方式:如果支持std::variant
且应该编译,并且有关macOS 10.14的提示很奇怪,因为我使用的是该版本,并且与受支持的C ++方言无关(并且该项目的部署目标是10.14)。
这是我做错了还是clang中的错误?
答案 0 :(得分:7)
所有可能引发std::variant
的{{1}}功能在标准头文件中从macOS 10.14(以及相应的iOS,tvOS和watchOS)开始被标记为可用。这是因为虚拟std::bad_variant_access
方法不是std::bad_variant_access::what()
,因此是在inline
中定义的(由操作系统提供)。
如果您想在运行于旧版操作系统上的应用中使用libc++.dylib
,只需使用std::get_if
。在您的示例中:
std::variant
您还可以使用w.index()
和std:: holds_alternative <int>(w)
进行预先检查。
编辑:
另请参阅我的answer与if (auto* p = std::get_if<int>(&w)) {
// use *p
} else {
// error handling
}
的类似问题(不幸的是,这种方法不那么方便)
答案 1 :(得分:3)
事实证明,该项目已设置为macOS 10.14,但尚未设置为仍在10.13上的实际构建目标。将其还原为继承部署目标后,测试代码就开始可以正常编译。
这是一个有趣的转折,因为可以安装XCode 10(因此LLVM 10.0)并用于在10.13上构建C ++ 17应用程序。