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()
需要完整类型,但标准不会出现以指定任何一种方式。
如果这些实现中的任何一个遵循标准规定,那么哪个?
答案 0 :(得分:15)
N3936§ 17.6.4.8其他功能[res.on.functions] :
1在某些情况下(替换函数,处理函数,用于实例化标准库模板组件的类型的操作),C ++标准库依赖于C ++程序提供的组件。如果这些组件不符合要求,则标准对实施没有要求。
2特别是,在以下情况下效果未定义:
- ...
- 如果在实例化模板组件时将不完整类型(3.9)用作模板参数, 除非特别允许该组件。
快速浏览 20.9.3类模板reference_wrapper
[refwrap] 显示reference_wrapper
没有此类特定异常,因此您的程序具有未定义的行为。两种实现都是一致的。