std :: variant <> :: get()无法与Apple LLVM 10.0一起编译

时间:2018-09-26 15:30:52

标签: c++ c++17 llvm-clang variant

我正在使用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中的错误?

2 个答案:

答案 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)进行预先检查。

编辑: 另请参阅我的answerif (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应用程序。