C++ 模板别名范围

C++ 模板别名范围,c++,template-aliases,C++,Template Aliases,根据,别名是块级声明。它并没有说模板别名有什么特别之处,所以应该理解模板别名也是块级声明 但是,不可能在块级别使用模板别名。根据编译器的不同,错误是不同的——虽然g++给出了一条有意义的消息,表示块范围内不允许使用模板,但clang是完全神秘的。(例如:) 到目前为止,我有以下问题: cppreference是否未能指定模板别名不能在块范围内使用?(或者我需要参加阅读课程吗?) 编译器在块级拒绝使用模板别名的做法是否正确(我发现这一特性对于我的特定编码习惯非常有趣) 如果第二个问题的答案是肯定

根据,别名是块级声明。它并没有说模板别名有什么特别之处,所以应该理解模板别名也是块级声明

但是,不可能在块级别使用模板别名。根据编译器的不同,错误是不同的——虽然g++给出了一条有意义的消息,表示块范围内不允许使用模板,但clang是完全神秘的。(例如:)

到目前为止,我有以下问题:

  • cppreference是否未能指定模板别名不能在块范围内使用?(或者我需要参加阅读课程吗?)
  • 编译器在块级拒绝使用模板别名的做法是否正确(我发现这一特性对于我的特定编码习惯非常有趣)
  • 如果第二个问题的答案是肯定的,那么其理由可能是什么?为什么编译器会拒绝我这个纯粹的语法糖
编译器运行正常

C++14标准第14节:

模板声明只能作为命名空间范围或类出现 范围声明


别名模板为[临时别名]

其中声明为别名声明的模板声明(第7条)将标识符声明为 必须是别名模板。别名模板是类型族的名称。别名模板的名称是 模板名称

如果我们看14.2[温度],我们有

模板声明只能作为命名空间范围或类范围声明出现。在函数中 模板声明,声明器id的最后一个组件不得为模板id

所以,yes CPPFREFERENCE表示可以在块范围内声明它,并且编译器是正确的。如果你点击了它的链接,你会看到一个声明列表,在这个列表中它有,在那里它有

类(包括结构和联合)、成员类或成员枚举类型、函数或成员函数、命名空间范围内的静态数据成员、类范围内的变量或静态数据成员(自C++14起)或别名模板(自C++11起)的声明也可以定义模板专门化

至于为什么标准说模板只能在命名空间范围或类范围内声明,我喜欢

问题可能与实现模板的历史方式有关:早期的实现技术(有些至今仍在使用)要求模板中的所有符号都具有外部链接。(实例化是通过在单独的文件中生成等效代码来完成的。)函数中定义的名称从来没有链接,不能在定义它们的范围之外引用


你是“纯语法糖”,不,不是这样的。然而,我刚刚下床,我的神经元还没有完全激活。其他人必须详细说明。好吧,编译器是按照标准运行的。现在,你知道我最后一个问题的答案吗?@SergeyA你什么意思?你的最后一个问题是没有意义的,因为我们不能在块范围内声明模板。好吧,这不是一个模板声明(即使按标准打上了这样的烙印)。这是模板别名声明,两者之间有区别。我再次看到templare alias是一种纯粹的语法糖。禁止它在块范围内声明的原因是什么?如果允许的话,它会打破什么?@SergeyA不,没有区别。您仍然必须使用别名模板指定类型。使用vec2d=std::vector获取
模板vec2d
like
vec2dfoo时,我们仍然需要指定类型如果您使用的是template关键字,则它是一个模板声明。这很好。问题是,为什么它被禁止。应该有一个原因,比如编译器无法处理它,它将是不安全的,等等。我看不出来。使用ve2d=std::vector的模板只是一个简写。所以,每当编译器看到ve2d时,它就可以将其导出到std::vector中。我不明白为什么需要禁止。这就是我要问的问题。