请考虑以下内容:
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年(在圣地亚哥会议上)被接受的,因此适用于C++20而不是C++17。 此外,在将代码编译为C++20预览版时,即使在Visual Studio中,P0608R3也没有得到实现。
如何以最佳/最简短的方式使指向非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
,那么只有当它的参数恰好是一个可能带有cv限定符的bool
时,该类型才应该被operator=
激活。也就是说,不应该进行任何隐式转换。 - Igor G