繁体   English   中英

是否允许使用 class 类型的 std::function 成员变量(不完整类型)?

[英]Is a std::function member variable of the class type allowed (incomplete type)?

我想知道这样做是否可以,它对我来说编译得很好,但我不确定它是否真的可以:

class Foo {
  std::function<Foo(Foo& f)> my_function;
};

function my_function接受一个Foo引用并返回一个Foo 它是Foo内部的成员变量,通常不允许使用这些不完整的类型。 例如:

class Foo {
   std::vector<Foo> foos;
};

行不通我不认为( boost 的一个好处是它确实适用于boost::container::vector )。

确实,通常情况下,使用不完整类型的 arguments 从标准库实例化模板是无效的:

[res.on.functions]/2特别是,在以下情况下效果未定义:
(2.5) — 如果在实例化模板组件时将不完整类型 (6.9) 用作模板参数,除非该组件特别允许。

但是, Foo(Foo& f)不是不完整的类型,即使Foo是:

[basic.types]/5已声明但未定义的 class、某些上下文 (10.2) 中的枚举类型或未知边界或不完整元素类型的数组是未完全定义的 object 类型 未完全定义的 object 类型和cv void是不完整类型...

Foo(Foo& f)是 function 类型。 它没有在这个定义中列出,所以不可能是不完整的。


std::vector特别允许用不完整类型的参数实例化:

[vector.overview]/3如果分配器满足分配器完整性要求 (20.5.3.5.1),则在实例化向量时可以使用不完整类型T T应在引用所产生的vector特化的任何成员之前完成。

根据标准,这似乎很好。

[res.on.functions]/2说:

[...] [The] 效果在以下情况下是不确定的:

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

But while a class type is incomplete within the immediate body of that class, a function type derived from that class type is not incomplete (since a function type is not an object type), much as a pointer to an incomplete class type is not an不完整的类型。 [func.wrap] 中也没有要求Rstd::function<R(Args...)> Args的 Args 应该是完整类型。

或多或少,这相当于拥有一个Foo(*)(Foo&)类型的 class 数据成员(指向函数的指针),这也很好。

您需要注意不要在 class 的直接主体中调用std::function数据成员(例如,在数据成员初始化程序中)。 (这是因为返回 class prvalue 的 function 调用表达式在某些时候需要临时实现转换,这需要Foo是完整的。)对于内联定义的成员函数。

暂无
暂无

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

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