gpt4 book ai didi

c++ - 是否允许类类型的 std::function 成员变量(不完整类型)?

转载 作者:行者123 更新时间:2023-12-01 14:36:44 30 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

确实,一般来说,使用不完整类型的参数实例化标准库中的模板是无效的:

[res.on.functions]/2 In particular, the effects are undefined in the following cases:
(2.5) — if an incomplete type (6.9) is used as a template argument when instantiating a template component, unless specifically allowed for that component.

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

[basic.types]/5 A class that has been declared but not defined, an enumeration type in certain contexts (10.2), or an array of unknown bound or of incomplete element type, is an incompletely-defined object type. Incompletely-defined object types and cv void are incomplete types...

Foo(Foo& f) 是一个函数类型。它未在此定义中列出,因此不可能不完整。


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

[vector.overview]/3 An incomplete type T may be used when instantiating vector if the allocator satisfies the allocator completeness requirements (20.5.3.5.1). T shall be complete before any member of the resulting specialization of vector is referenced.

关于c++ - 是否允许类类型的 std::function 成员变量(不完整类型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62121765/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com