[英]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
特化的任何成员之前完成。
根据标准,这似乎很好。
[...] [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] 中也没有要求R
或std::function<R(Args...)>
Args
的 Args 应该是完整类型。
或多或少,这相当于拥有一个Foo(*)(Foo&)
类型的 class 数据成员(指向函数的指针),这也很好。
您需要注意不要在 class 的直接主体中调用std::function
数据成员(例如,在数据成员初始化程序中)。 (这是因为返回 class prvalue 的 function 调用表达式在某些时候需要临时实现转换,这需要Foo
是完整的。)对于内联定义的成员函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.