std::optional
具有复制转换和移动转换模板化构造函数,可以构造 std::optional<B>
的实例实例为 std::optional<A>
当B
可从 A
构造.
不幸的是,这些构造函数似乎不适用于 boost::variant
有bool
在允许的类型之内。为什么会这样?
您可以看到该限制适用于 std::optional
但不适用于boost::optional
在接下来的神箭中。代码也复制如下。
https://gcc.godbolt.org/z/PKTEET
#include <boost/optional.hpp>
#include <boost/variant.hpp>
#include <optional>
struct A
{};
struct B
{
B(A) {}
};
void f() {
boost::optional<A> boptA;
boost::optional<B> boptB{boptA};
std::optional<A> soptA;
std::optional<B> soptB{soptA};
{
boost::optional<boost::variant<B>> vB;
vB = boptA; // 1. success
}
{
boost::optional<boost::variant<B, bool>> vB;
vB = boptA; // 2. success
}
{
std::optional<boost::variant<B>> vB;
vB = soptA; // 3. success that compares with #1
}
{
std::optional<boost::variant<B, bool>> vB;
vB = soptA; // 4. compilation error that should have compared with #2
}
}
最佳答案
boost::variant<B, bool>
声称可以从 std::optional<A>
构建,因为bool
可从 std::optional<A>
构造(由于 explicit conversion operator )。
因此,std::optional<boost::variant<B, bool>>
将尝试直接从 std::optional<A>
构造包含的对象无需打开包装。
但是boost::variant
的实现在内部使用隐式转换,并且您不能隐式转换 optional
至bool
,因此出现错误。
关于c++ - 为什么 std::optional<boost::variant<A, bool>> 没有从 `std::optional<A>` 成功构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66177826/