#include <iostream>
#include <string>
#include <variant>
int main()
{
std::variant<std::string, bool> v{ "hasta la vista" };
std::cout << std::boolalpha << std::holds_alternative<std::string>(v) << ' ' << std::holds_alternative<bool>(v) << std::endl;
}
海湾合作委员会 12.1.1
$ g++ std_alternative.cpp
$ ./a.out
true false
海湾合作委员会 8.5.0
$ g++ -std=c++17 std_alternative.cpp
$ ./a.out
false true
为什么输出不同?根据 c++17,哪个是正确的?我应该怎么做才能使我的代码以相同的方式在两个版本的 GCC 上运行?
struct explicit_bool {
bool b = false;
template<class T,
std::enable_if_t<std::is_same_v<T, bool>, bool> = true
>
explicit_bool( T v ):b(v){}
explicit_bool(explicit_bool const&) noexcept=default;
explicit_bool& operator=(explicit_bool const&)& noexcept=default;
explicit_bool()noexcept=default;
~explicit_bool()noexcept=default;
bool operator!() const { return !b; }
explicit operator bool() const { return b; }
};
存储其中一个(而不是 bool
)。
它只接受实际的 bool
s等explicit_bool
s 作为参数。
您可能必须添加一些显式转换到-从 bool
执行此操作后在您的代码中。您可能会对 (bool)
感兴趣因为 Actor 总是做与 static_cast<bool>
完全相同的事情与 C++ 风格的转换相比,与许多其他 C 风格的转换不同;这可以减轻痛苦。另一个选择是 !!
, 它将大多数类型转换为 bool
含蓄地。