第一种变体类模板,
boost::variant
,早于C++17
std::variant
看见
this question
将其与
std::变体
。主要的区别在于,当在变量中构造值时引发异常时,该怎么办。
这个
std::变体
选择是允许一个毫无价值的国家;这个
boost::variant
选择是在堆上构造新对象,而不是就地构造,并存储指向该位置的指针。
boost::variant2
一方面,它希望遵守C++17 API,但另一方面,它表达了对其在这一问题上的选择的不满。
boost::variant2
选择第三个选项,与之前的两种实现不同:双缓冲。它的大小是问题类型的两倍;在未使用的一半中构造一个新值,一旦构造成功,就会销毁另一半中的旧值。如果所有类型都不是可构造的,那么这是不必要的,而且
boost::variant2
实际上不会有双缓冲区。
这个选择意味着
boost::variant2
可以
永远不要毫无价值
; 事实上,它的文件标题强调了这一事实。