C++ 如何将不完整类型用作此处向量的模板参数?

C++ 如何将不完整类型用作此处向量的模板参数?,c++,c++11,language-lawyer,C++,C++11,Language Lawyer,直到以下计划合法化和诸如此类: #include <vector> struct Bar; struct Foo { using BarVec = std::vector<Bar>::size_type; }; struct Bar {}; int main() { Foo f; } #包括 结构杆; 结构Foo { 使用BarVec=std::vector::size\u类型; }; 结构条{}; int main() { 福福; } 怎么做B

直到以下计划合法化和诸如此类:

#include <vector>

struct Bar;

struct Foo
{
    using BarVec = std::vector<Bar>::size_type;
};

struct Bar {};

int main()
{
   Foo f;
}
#包括
结构杆;
结构Foo
{
使用BarVec=std::vector::size\u类型;
};
结构条{};
int main()
{
福福;
}
怎么做
Bar
是一个不完整的类型,因此编译器无法知道什么是
std::vector
,或者它包含一个成员
size\u type
,或者该成员
size\u type
是一个类型

我能给出的唯一解释是,任何假设的专业化(大概)必须已经在范围内,才能使
size\u type
具有与“基本”模板定义中给出的含义不同的含义,
size\u type
不是一个依赖名称(这两个因素都有助于编译器的确定性)


这里的法律依据是什么?

我认为在实践中这可能有效,但从我所能看出,这看起来像是未定义的行为。从C++11标准草案
17.6.4.8
[res.on.functions]:

特别是,在以下情况下,影响未定义:

[……]

  • 如果在实例化模板组件时将不完整类型(3.9)用作模板参数, 除非该组件特别允许
尽管实例化模板组件似乎不是一个定义良好的术语

我通过以下途径了解到:

除非组件特别允许

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

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

作为
共享\u ptr
的例外,因为上述引用与
20.6.6.2
[util.smartptr.shared]中的此引用冲突:

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


另见

这些都不能直接回答您的问题(即指向标准的特定部分),但它们提供了一些见解,您是如何知道该计划是合法的等等的?我能够编译它,但如果你有更权威的资料来源,我们也许可以从那里开始工作。@DrewDormann:公平地说,没有什么权威性的东西(这就是我在这里寻找的),但是。“事实上这是不合法的”加上证据,在这里是一个完全正确的答案法律依据是[res.on.functions]/2.5 pre-C++1z的UB:“特别是,在以下情况下,效果是未定义的:[…]如果在实例化模板组件时使用不完整的类型(3.9)作为模板参数,除非该组件特别允许。”在更一般的情况下,答案是不完整并不重要<代码>条仍然只是一种类型,而不是无数种可能的类型<代码>无效是不完整的类型,无法完成;我们总是在
void
上实例化模板。标准中的各种规则禁止“后期专业化”场景。请参阅4371的更新版本,该版本为