代码之家  ›  专栏  ›  技术社区  ›  einpoklum

为什么Boost中有两个变体类实现?

  •  0
  • einpoklum  · 技术社区  · 3 年前

    Boost似乎有两种变体类模板的实现:

    Boost two include two采用相同概念的情况很少见(尽管并非闻所未闻)。为什么变种会发生这种情况?这些变体有何不同?

    1 回复  |  直到 3 年前
        1
  •  4
  •   Giovanni Cerretani    3 年前

    第一种变体类模板, boost::variant ,早于C++17 std::variant 看见 this question 将其与 std::变体 。主要的区别在于,当在变量中构造值时引发异常时,该怎么办。

    这个 std::变体 选择是允许一个毫无价值的国家;这个 boost::variant 选择是在堆上构造新对象,而不是就地构造,并存储指向该位置的指针。

    boost::variant2 一方面,它希望遵守C++17 API,但另一方面,它表达了对其在这一问题上的选择的不满。

    boost::variant2 选择第三个选项,与之前的两种实现不同:双缓冲。它的大小是问题类型的两倍;在未使用的一半中构造一个新值,一旦构造成功,就会销毁另一半中的旧值。如果所有类型都不是可构造的,那么这是不必要的,而且 boost::variant2 实际上不会有双缓冲区。

    这个选择意味着 boost::variant2 可以 永远不要毫无价值 ; 事实上,它的文件标题强调了这一事实。

    推荐文章