我可以实例化 std::reference_wrapper<T> 其中 T 是不完整的类型吗?
Can I instantiate an std::reference_wrapper<T> where T is an 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()
需要完整的类型,但标准不会出现来指定任何一种方式。
如果有,这些实现中的哪一个遵循标准要求?
N3936§17.6.4.8其他函数[res.on.functions]:
1在某些情况下(替换函数、处理程序函数、对用于实例化标准库模板组件的类型的操作),C++标准库依赖于C++程序提供的组件。如果这些组件不符合其要求,则本标准不对实施提出任何要求。
2特别是,在以下情况下,影响是不明确的:
- 如果在实例化模板组件时使用不完整类型(3.9)作为模板参数,除非该组件特别允许
快速扫描20.9.3类模板reference_wrapper
[refwrap]不会发现reference_wrapper
有这样的特定异常,因此您的程序具有未定义的行为。两种实现方式都是一致的。
相关文章:
- 如何定义自定义生成配置类型,其中通常是.exe的目标改为 DLL
- C++类型别名,其中值被替换
- 创建类类型的动态分配数组,其中类不得具有默认构造函数
- 为什么'typeid(x) == typeid(y)'的计算结果为 true,其中 'x' 和 'y' 分别是 T 和 T& 类型的 id-表达式?
- 为什么 (-i) 的类型(其中 i 是无符号的 int)仍然是无符号的 int?
- 引用的静态强制转换强制模板实例化,其中不完整的类型很好
- 模板函数,其中模板参数类型取决于函数参数
- 将 32 位浮点数和不强制转换的 32 位整数与双精度进行比较,当其中一个值可能太大而无法完全适合另一种类型时
- 对条件表达式结果的赋值(其中第二个和第三个操作数是相同类型和值类别的变量)是否仍然存在?
- 无法汇总初始化类型结构的变量,其中包含在类模板中的位字段成员
- 如何在基本模板类中声明成员,其中类型取决于派生类的类型
- 设计具有变体字段的文本类型类,其中可以存储一个或三个对象
- C++联合如何知道其中存储的类型以及要调用哪个析构函数
- 如何使用类型专用化模板方法,该类型本身就是一个模板,其中只有返回类型依赖于模板类型
- 调用C 功能,其中包含来自C的STL数据类型
- 创建一个类型bool的向量,其中所有值均可初始化为true
- 传递std ::向量的派生类型,其中预期基本类型的std ::向量
- C++11:return_type(对于 std::bind),其中返回类型基于输入类型
- 如何将 void 指针类型转换为 int 指针,然后在其中存储 int
- 变量模板函数,其中返回类型取决于模板参数列表