我可以实例化 std::reference_wrapper<T> 其中 T 是不完整的类型吗?

Can I instantiate an std::reference_wrapper<T> where T is an incomplete type?

本文关键字:类型 其中 std wrapper lt 实例化 gt 我可以 reference      更新时间:2023-10-16

std::reference_wrapper<T>是否允许T不完整,就像处理T&而不处理T一样?

GCC 4.9接受以下内容:

#include <functional>
struct woof;
struct test
{
   test(woof& w) : w(w) {}
   std::reference_wrapper<woof> w;
};
struct woof
{
   int a;
};
int main()
{
    woof w;
    test t = w;   // (braced-init would be better, but VS2012!)
}

但MSVS 2012拒绝了它,并给出了以下信息:

错误1错误C2139:"woof":不允许将未定义的类作为编译器内部类型特征"__is_abstract"c:\program files(x86)\microsoft visual studio 11.0\vc\include\type_traits 755 1 test3 的参数

我怀疑这是因为op()需要完整的类型,但标准不会出现来指定任何一种方式。

如果有,这些实现中的哪一个遵循标准要求?

N3936§17.6.4.8其他函数[res.on.functions]

1在某些情况下(替换函数、处理程序函数、对用于实例化标准库模板组件的类型的操作),C++标准库依赖于C++程序提供的组件。如果这些组件不符合其要求,则本标准不对实施提出任何要求。

2特别是,在以下情况下,影响是不明确的:

  • 如果在实例化模板组件时使用不完整类型(3.9)作为模板参数,除非该组件特别允许

快速扫描20.9.3类模板reference_wrapper[refwrap]不会发现reference_wrapper有这样的特定异常,因此您的程序具有未定义的行为。两种实现方式都是一致的。

相关文章: