这里如何将不完整类型用作向量的模板参数?

轨道轻赛

直到以下程序合法,否则:

#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不是从属名称(两者都有助于编译器确定性的因素)。

这里的法律依据是什么?

沙菲克·雅格慕(Shafik Yaghmour)

我认为在实践中这可能行得通,但据我所知,这似乎是未定义的行为。根据C ++ 11标准草案17.6.4.8 [res.on.functions]

特别是在以下情况下,效果是不确定的:

[...]

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

尽管实例化模板组件似乎不是一个明确定义的术语。

我是通过LWG缺陷611来到这里的,该缺陷添加了:

除非组件特别允许。

到上面项目符号的末尾,因此现在显示为:

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

作为例外,shared_ptr因为上述引用与20.6.6.2[util.smartptr.shared]中的引用冲突

shared_ptr的模板参数T可能是不完整的类型。

另请参见N4371:对标准容器的最小不完整类型支持,修订版2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章