【问题标题】:What are the rules for standard library containers and incomplete types?标准库容器和不完整类型的规则是什么?
【发布时间】:2020-11-13 14:07:47
【问题描述】:

给定一个不完整的类型:

struct S; 

那么下面的声明就是:

S *p;            // ok, pointer to incomplete types is allowed

std::deque<S> l;  // error, instantiating std::deque with incomplete type is UB

但是下面的声明呢?

std::deque<S> *p;   // seems to be UB like the previous case, 
                   // but is it ok if p is not used till S is defined?

std::deque<S*> p;   // not really sure about this one

编辑:问题使用std::list 而不是std::deque,但这违背了问题的目的,因为std::list 明确allowed 使用不完整的类型。 std::deque 似乎没有这样的permission

【问题讨论】:

  • 我会说std::list&lt;S*&gt; p; 很好。编译器在没有布局/大小的情况下生成指向结构的指针应该不是问题。 ?
  • @LanguageLawyer 不,我特意选择了list,因为我认为它没有使用不完整类型的权限。但 eeorika 的回答表明确实如此。那我得编辑一下这个问题。
  • @LanguageLawyer 编辑了问题以使用不允许不完整类型的容器(据我所知)。

标签: c++ language-lawyer c++-standard-library incomplete-type


【解决方案1】:
std::deque<S> *p;   // seems to be UB like the previous case, 
                   // but is it ok if p is not used till S is defined?

这实际上是有趣的地方。是的,实例化不完整类型的容器是不允许的,没有任何规定。但问题是它是否真的被实例化了。根据核心语言,它不一定是。

[temp.inst]

1 除非已经明确明确了类模板特化 实例化或显式特化的类模板 当专业化是隐式实例化时 在需要完全定义的对象类型的上下文中引用 或者当类类型的完整性影响到语义时 程序。

指向类型的指针不需要类型是完整的。因此,仅此声明通常不足以导致类模板的实例化,因此确定此处违反了容器的要求可能为时过早。

当然,除非我们将“类类型的完整性影响程序的语义”纳入标准库中的合同违规。我想一个实现可以在这里实例化。但是,我不知道有任何实现,所以这可能不是期望的解释。

所以为了谨慎起见,我也认为这个 UB。


std::deque<S*> p;  // not really sure about this one

这很好。不管S是否完整,S*仍然是一个完整的对象类型。我这样说是因为它不包含在

[basic.types]

5已声明但未定义的类,枚举 在某些上下文中键入([dcl.enum]),或未知边界的数组或 不完整元素类型,是不完整定义的对象类型。 未完全定义的对象类型和 cv void 是不完全类型 ([基本.基础])。对象不应被定义为具有 类型不完整。

关于S 完整性的约束仅在尝试在执行取消引用或指针算术的表达式中使用此类指针时出现。但是指针类型本身还是完整的。所以它是容器类型的有效模板参数。

【讨论】:

  • 我不确定您所说的“过早确定...”是什么意思。绝对没问题,还是允许实现拒绝这个?
  • @cigien - 好吧,我读到 “当类类型的完整性影响程序的语义时” 非常广泛。有人可能会争辩说这种类型的完整性会影响程序的语义。
  • 我当然认为程序的正确性与程序的语义有关。 IMO 的措辞暗示这没问题,但我主要是在这里猜测。
  • @cigien - 好吧,我在上次编辑中总结了我的想法。
  • 谢谢,这样更好。我总是更喜欢有立场的答案,无论是对还是错:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 2012-04-23
  • 2021-03-26
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
相关资源
最近更新 更多