我确实知道std::variant
适用于不完整的类型。但是,我不知道它如何工作,因为据我了解,std::variant
必须需要它所拥有的类型的最大大小。
因此,为什么此代码不能与s1
和s2
一起编译。如何使其像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() {}
答案 0 :(得分:3)
我确实了解std :: variant可以使用不完整的类型。
我不认为你这样做。不是。
但是,我不知道它如何工作,因为
这很有道理。它不起作用,因为:
在我不了解的std :: variant中,必须需要它拥有的类型的最大大小。
这是标准所说的:
[res.on.functions]
在某些情况下(替换函数,处理函数,用于实例化标准库模板组件的类型的操作),C ++标准库取决于C ++程序提供的组件。 如果这些组件不满足其要求,则本文档对实现不作任何要求。
尤其是在以下情况下,效果未定义:
...
- 如果在实例化模板组件或评估概念时将不完整的类型([basic.types])用作模板参数,除非该组件特别允许。
[variant]部分中没有允许不完整类型的特定规则。