C++标准是否明确允许/禁止实例化不完整类型的 std::函数?
Does the C++ standard explicitly allow/disallow instantiating std::function with incomplete types?
考虑这样的事情:
class A;
std::function<A(A)> f;
这显然是您希望在程序中执行的操作。任何主要的编译器都可以毫无问题地接受这一点。
我的问题是:标准在技术上允许吗?
如果我没看错,该部分
20.5.4.8 其他功能
禁止在实例化时使用不完整类型的模板参数,除非另有指定(不仅适用于容器(。
在关于std::function
或<functional>
的部分中,我没有看到允许这样做的参考。
有人知道这是否明确写在标准中吗?
这由库 catch-all [res.on.functions]/2 涵盖
特别是,在以下情况下,效果是不确定的:[...]
- 如果在实例化模板组件或计算概念时将不完整的类型 ([basic.types]( 用作模板参数,除非该组件特别允许。
由于 [func.wrap.func] 中的任何内容都不会覆盖这一点,因此具有不完整的函数类型是未定义的行为。
作为您需要在 [func.wrap.func] 中看到的内容的示例,让我们看看 [unique.ptr]/4
[...]unique_ptr的模板参数 T 可能是不完整的类型。
在这里,它明确指出允许不完整的类型。 我们在 [func.wrap.func] 中需要类似的东西,但我们不需要,所以我们回退到 [res.on.functions]/2 并且它是未定义的行为。
相关文章:
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 错误:无法传递非平凡类型"std::string"的对象和更多错误
- 与'operator<<'不匹配(操作数类型'std::ostream {aka std::basic_ostream<char>}'
- std::函数指针错误:无法将 &A::a 转换为类型 std::function<>&&
- 包括<字符串>,使用不完整的类型"std::string"
- 与"operator<<"不匹配(操作数类型'std::ostream'
- 错误:类型"std::__1::basic_string<char>"不提供呼叫运算符
- 错误:请求从"Mstream"转换为非标量类型"std::string {aka std::basic_string<char>}"
- 错误:移动文件时'QString'为非标量类型"std::__cxx11::字符串"
- CLion 无法解析类型 std::unordered_map,即使它提示我包含标头并且编译工作
- 字符串C :libc abi.dylib:终止未被发现的类型std :: out_of_range:basic
- 返回类型 std::optional<std::variant<...>>
- 变量具有不完整的类型std :: String;string.h有很多错误
- 对类型 'A *' 的非常量左值引用不能绑定到不相关的类型 'std::shared_ptr<A>' 的值
- 来自类型为std::basic_string::const_iterator的非常量引用的无效初始化,并且<char>来自类型std::basic_string<char>::
- 类型"std::array<char,6>"和"char"不兼容
- 此错误的含义是什么:从 'char* [40] 转换为非标量类型 'std::string
- 使用 TypedEq() 匹配类型 std::vector<std::vector>
- 如何修复错误:请求从"void"转换为非标量类型"std::vector<int>"