为什么不将typename模板参数隐式识别为类型?

ein*_*ica 5 c++ templates using-directives language-lawyer c++17

通常在C++类定义中,特别是在库,特征类等中,您会看到类似于以下代码段的代码:

template <typename Bar, typename Baz>
class Foo {
    using bar_type = Bar;
    using baz_type = Baz;
    // ... etc.
}
Run Code Online (Sandbox Code Playgroud)

只有这些行才可以在以后引用Foo<A,B>::bar_typeFoo<C,D>:baz_type.我想知道:为什么语言标准不要求编译器使用typename模板参数自动定义类型,即允许使用行删除两个,并识别Foo<A,B>::Baras AFoo<C,D>::Bazas D

这甚至不应该破坏现有代码,因为在Foo中,无论如何都已经使用了标识符Bar和Baz.

Ker*_* SB 7

参数名称不是要声明的实体的一部分.对于函数和模板都是如此.以下代码仅声明两个单独的实体:

extern void f(int, char, bool);
extern void f(int a, char b, bool c);
extern void f(int x, char b, bool z);

template <typename> struct X;
template <typename A> struct X;
template <typename T> struct X;
Run Code Online (Sandbox Code Playgroud)

请特别注意以下代码完全正常:

template <typename T> struct X { void f(); };   // X<T>::f not yet defined
template <typename U> void X<U>::f() {}         // now it's defined
Run Code Online (Sandbox Code Playgroud)

从参数名称派生其他结构的所有尝试都必须处理这种情况.该领域最受欢迎的请求之一是命名函数参数; 到目前为止,尚无令人满意的延期提议.

在某种程度上,所有这些提议都需要使参数名称成为声明实体的一部分.例如,对于函数,这会引发一个问题,即参数名称是否需要被修改并暴露给链接器.