c++ - C++ 标准是否明确允许/禁止使用不完整类型实例化 std::function?
问题描述
考虑这样的事情:
class A;
std::function<A(A)> f;
这显然是你想在你的程序中做的事情。任何主要的编译器都可以毫无问题地接受这一点。
我的问题是:标准在技术上允许吗?
如果我没看错,该部分
20.5.4.8 其他功能
禁止在实例化时使用不完整类型的模板参数,除非另有说明(不仅限于容器)。
在关于std::function
或<functional>
我看不到允许这样做的部分中。
有人知道在哪里以及是否在标准中明确写入了吗?
解决方案
特别是,在以下情况下效果是不确定的:[...]
- 如果在实例化模板组件或评估概念时将不完整的类型 ([basic.types]) 用作模板参数,除非该组件特别允许。
由于[func.wrap.func]中没有任何内容覆盖它,因此具有不完整的函数类型是未定义的行为。
作为一个你需要在 [func.wrap.func] 中看到的例子,让我们看看[unique.ptr]/4
[...] unique_ptr 的模板参数 T 可能是不完整的类型。
在这里,它明确指出允许使用不完整的类型。我们在 [func.wrap.func] 中需要类似的东西而我们不需要,所以我们回退到 [res.on.functions]/2 并且它是未定义的行为。
推荐阅读
- java - removeIf() 方法。从 List 中删除所有元素
- robotframework - 我们如何为机器人框架中的 if 循环定义一组指令而不是一个指令?
- spring-webflux - WebFilters 之间是否有队列
- automation - Ansible:控制用户需求
- c# - 如何为“始终在顶部”或“最顶部”添加可以打开和关闭的复选框
- angularjs - AngularJS工厂在不同的文件中
- python - 在 Python 中将 4D 数据绘制为分层热图
- javascript - 为什么
- amazon-web-services - 每次代码部署时如何创建新目录
- javascript - 如何使用 HTML 按钮和 PHP 创建目录