[英]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.