繁体   English   中英

std :: variant和incomplete类型:如何工作?

[英]std::variant and incomplete type: how does it work?

我确实了解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 :: variant可用于不完整类型。

我不认为你这样做。 没有。

但是,我不知道它如何工作,因为

那讲得通。 它不能工作,因为:

在我不了解的情况下,std :: variant必须需要它拥有的类型的最大大小。


这就是标准所说的:

[res.on.functions]

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

特别在以下情况下, 效果是不确定的:

...

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

[variant]节中没有允许不完整类型的特定规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM