STD ::变体和不完整类型:它如何工作



我确实知道std::variant与不完整的类型一起使用。但是,我不明白它是如何工作的,因为在我理解的情况下,std::variant必须需要它所拥有的类型的最大大小。

那么,为什么此代码不使用s1s2编译。如何使其像std::variant一样工作?

#include <variant>
#include <vector>
#include <type_traits>
#include <typeinfo>
#include <iostream>
struct Rect;
struct Circle;
using Shape = std::variant<Rect, Circle>;
template<typename C>
struct S {static constexpr auto s = sizeof(C);};
constexpr auto s1 = S<Rect>::s;
constexpr auto s2 = sizeof(Rect);
struct Circle{};
struct Rect{
    std::vector<Shape> shapes;
};
int main() {}

我确实知道std ::变体可与不完整类型一起使用。

我不认为你这样做。不是。

但是,我不明白它的工作方式,因为

这很有意义。它无法正常工作,因为:

在我的不稳定的std ::变体中,必须需要它所持类型的最大尺寸。


这是标准所说的:

[res.on.functions]

在某些情况下(替换功能,处理程序功能,用于实例化标准库模板组件的类型的操作(,C 标准库取决于C 程序提供的组件。 如果这些组件不符合其要求,则此文档对实施没有任何要求

特别是,在以下情况下,效果是未定义的

...

  • 如果不完整的类型([basic.types](在实例化模板组件或评估概念时用作模板参数,除非专门用于该组件。

[变体]允许不完整类型的部分中没有具体规则。

最新更新