是否允许类类型的 std::function 成员变量(不完整类型)?
Is a std::function member variable of the class type allowed (incomplete type)?
我想知道这是否很好,它对我来说编译得很好,但我不确定它是否真的可以:
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 特别是,在以下情况下,效果是未定义的:
(2.5( — 如果在实例化模板组件时将不完整的类型 (6.9( 用作模板参数,除非该组件特别允许。
但是,Foo(Foo& f)
不是不完整的类型,即使Foo
是:
[basic.types]/5已声明但未定义的类、某些上下文中的枚举类型 (10.2( 或未知绑定或不完整元素类型的数组是未完全定义的对象类型。未完全定义的对象类型和cv
void
是不完整的类型...
Foo(Foo& f)
是一种函数类型。它未在此定义中列出,因此不可能不完整。
std::vector
特别允许使用不完整类型的参数进行实例化:
[vector.overview]/3 如果分配器满足分配器完整性要求(20.5.3.5.1(,则在实例化向量时可以使用不完整的类型
T
。 在引用由此产生的vector
专业化的任何成员之前,T
应完整。
根据标准,这似乎很好。
[res.on.functions]/2 说:
[这些]效果在以下情况下未定义:
- [...]
- 如果在实例化模板组件或计算概念时将不完整的类型 ([basic.types]( 用作模板参数,除非该组件特别允许。
但是,当类类型在该类的直接主体中不完整时,从该类类型派生的函数类型不是不完整的(因为函数类型不是对象类型(,就像指向不完整类类型的指针不是不完整的类型一样。 [func.wrap] 中也没有要求std::function<R(Args...)>
中的R
或Args
应该是完整的类型。
或多或少,这相当于有一个类型为Foo(*)(Foo&)
(指向函数的指针(的类数据成员,这也很好。
您需要注意不要在类的直接主体中调用std::function
数据成员(例如,在数据成员初始值设定项中(。(这是因为返回类 prvalue 的函数调用表达式在某些时候需要临时具体化转换,这需要类完成。在成员函数中调用它很好,因为Foo
到那时就完成了,即使对于内联定义的成员函数也是如此。
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 指针数据类型变量如何包含对象?
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- 如何为结构类型变量赋值
- 如何将字符类型变量附加到字符串中?
- 共享或私有 openmp 代码中的结构化类型变量
- 有没有办法在 c++ 中制作类型变量?
- 从其他类声明类类型变量会给出 C2143 错误(在"*"之前缺少";")
- 如何检查类中定义的枚举类型变量是否被分配给?
- 将子类实例保存在父类型变量中并通过父变量使用 Child 函数?
- 是否可以在没有结构的情况下创建新的类型变量?
- 为什么类型变量;不调用默认 CTR
- 如何使用CIN将输入整数值获取到char类型变量中
- 如何为 char** 类型变量提供适当的值,以便将其分配给字符串变量
- 在C++标准中哪里说必须初始化 const 内置类型变量的定义
- 为什么可以将其他类型变量用作C 中常量参考参数参数的参数
- Eclipse CDT 打开声明的自动类型变量
- 如何计算长长类型变量中的位数
- 将自动类型变量初始化为零.这种类型安全吗?