我应该使用什么而不是 void 作为变体中的替代类型之一?

What should I use instead of void as one of the alternative types in an variant?

我想要一个变体,它可能包含 Foo 类型、(不相交的)Bar 类型,或者什么都不包含。好吧,自然地,我在考虑使用 std::variant<Foo, Bar, void> - 但这似乎不起作用。也就是说,您可以定义此类型,但如果您尝试实例化此类型,您将失败 (GCC 8.2)。

那我用什么代替呢?某种空结构?

您真正想要的是备选方案中的一种类型,它具有 单个 可能值 - 而不是 void,它具有 没有 [=29] =] 可能的值(并且在其他方​​面存在问题)。换句话说:Aunit type instead of a bottom type

作为 <variant> 的一部分,标准库已经为这个用例定义了一个 "unit type":std::monostate(是的,它本质上是一个空结构)。使用它。

示例:

#include <variant>

using Foo = int;
using Bar = double;

int main() {
    std::variant<std::monostate, Foo, Bar> v; 
    v = Foo{}; 
}

请注意,与问题不同的是,单可能值类型是 第一个 选项;这允许变体是默认构造的,即使 Foo 不是。此外,以这种方式构造变体可能 cheaper/faster 而不是构造 Foo,即使它是默认构造的。