簡體   English   中英

std :: variant <> :: get()不能與Apple LLVM 10.0一起編譯

[英]std::variant<>::get() does not compile with 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_access std::variant功能都標記為可用,從標准頭文件中的macOS 10.14(以及相應的iOS,tvOS和watchOS)開始。 這是因為虛擬std::bad_variant_access::what()方法不是inline ,因此在libc++.dylib定義(由OS提供)。

如果你想在舊操作系統上運行的應用程序中使用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應用程序,這是一個有趣的轉折。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM