gpt4 book ai didi

c++ - 在构造 std::variant 时禁用从指针类型到 bool 的隐式转换的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-03 06:50:06 25 4
gpt4 key购买 nike

考虑以下:

struct foo {
};

struct bar {
};

int main()
{
foo f;
bar b;
std::variant<foo*, bool> v;
v = &b; // compiles in Visual Studio 19 v16.7.3
}
正如评论中所讨论的,我相信以上是合法的 C++17。有个提议, P0608R3 ,这被接受到解决这种令人惊讶的行为的标准中,但它在 2018 年(在圣地亚哥 session 上)被接受,因此适用于 C++20 而不是 C++17。此外,P0608R3 当前未在 Visual Studio 中实现,即使在编译到 C++20 预览版时也是如此。
从指向非 foo 的指针创建此变体的最佳/最不冗长的方法是编译时错误?
我相信以下内容有效,但如果变体包含多个项目,则是很多样板。
struct foo {
};

struct bar {
};

using variant_type = std::variant<foo*, bool>;
struct var_wrapper : public variant_type
{
var_wrapper(foo* v = nullptr) : variant_type(v)
{}

var_wrapper(bool v) : variant_type(v)
{}

template<typename T>
var_wrapper(T*) = delete;
};

int main()
{
foo f;
bar b;

var_wrapper vw;
vw = &f; // fine
vw = true; // fine
vw = &b; // compile time error
}
我错过了一些更简单的方法吗?

最佳答案

另一种解决方案是引入另一个bool除了 bool 之外,不从任何东西构建的包装器:

#include <variant>

struct foo {};
struct bar {};

struct StrongBool {
bool value = false;

StrongBool() noexcept = default;
StrongBool(bool b) noexcept : value(b) {}

template<class T>
StrongBool(T) = delete;
};

int main() {
foo f;
bar b;
std::variant<foo*, StrongBool> v;
v = true;
v = &f;
v = &b; // fails to compile
}
无论如何,限制可接受的初始值设定项需要使用用户定义的构造函数引入类型包装器。

关于c++ - 在构造 std::variant 时禁用从指针类型到 bool 的隐式转换的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64249832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com