直到以下程序合法,否则:
#include <vector>
struct Bar;
struct Foo
{
using BarVec = std::vector<Bar>::size_type;
};
struct Bar {};
int main()
{
Foo f;
}
怎么样?Bar
是一个不完整的类型,因此编译器无法知道std::vector<Bar>
它是什么,或者包含一个成员size_type
,或者该成员size_type
是一个类型。
我能提出的唯一解释是(假设)任何假设的专业化都必须已经在范围内,size_type
以使其具有与“基本”模板定义中给出的含义不同的含义,并且size_type
不是从属名称(两者都有助于编译器确定性的因素)。
这里的法律依据是什么?
我认为在实践中这可能行得通,但据我所知,这似乎是未定义的行为。根据C ++ 11标准草案17.6.4.8
[res.on.functions]:
特别是在以下情况下,效果是不确定的:
[...]
- 实例化模板组件时是否将不完整类型(3.9)用作模板参数,除非该组件特别允许。
尽管实例化模板组件似乎不是一个明确定义的术语。
除非组件特别允许。
到上面项目符号的末尾,因此现在显示为:
如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非该组件特别允许。
作为例外,shared_ptr
因为上述引用与20.6.6.2
[util.smartptr.shared]中的引用冲突:
shared_ptr的模板参数T可能是不完整的类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句