c++ - 为什么 std::optional<boost::variant<A, bool>> 没有从 `std::optional<A>` 成功构造?

标签 c++ c++17

std::optional具有复制转换和移动转换模板化构造函数,可以构造 std::optional<B> 的实例实例为 std::optional<A>B可从 A 构造.

不幸的是,这些构造函数似乎不适用于 boost::variantbool在允许的类型之内。为什么会这样?

您可以看到该限制适用于 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的实现在内部使用隐式转换,并且您不能隐式转换 optionalbool ,因此出现错误。

关于c++ - 为什么 std::optional<boost::variant<A, bool>> 没有从 `std::optional<A>` 成功构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66177826/

相关文章:

c++ - 使用 D3DX11CreateShaderResourceViewFromFile 加载 .PSD 文件

c++ - C++中的函数原型(prototype)和函数实现有什么区别?

c++ - C++ 中缩写函数的状态是什么?

c++ - 如果使用constexpr,是否可以删除控制流语句?

c++ - C++调试器

c++ - 难以理解 for 循环如何与 C++ 中的数组交互 [作业]

c++ - 默认容器参数

c++ - 静态内联函数中的局部函数静态对象不共享

c++ - 现代 C++ 中 std::bind 的替代方案

c++ - 创建别名时静态断言模板参数检查