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

时间:2014-09-25 16:44:24

标签: c++ c++11 language-lawyer incomplete-type

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()需要完整类型,但标准不会出现以指定任何一种方式。

如果这些实现中的任何一个遵循标准规定,那么哪个?

1 个答案:

答案 0 :(得分:15)

N3936§ 17.6.4.8其他功能[res.on.functions]

  

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

     

2特别是,在以下情况下效果未定义:

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

快速浏览 20.9.3类模板reference_wrapper [refwrap] 显示reference_wrapper没有此类特定异常,因此您的程序具有未定义的行为。两种实现都是一致的。