为什么我不能在函数内声明模板类型别名?

8
为什么我不能在函数内声明模板类型别名?
#include <vector>

int main(){

    //type alias deceleration:
    template <typename T>
    using type = std::vector<T>;

    //type instantiation:
    type<int> t;

}

错误: 模板声明不能出现在块作用域内

为什么我们必须将这些声明放在块作用域之外?

#include <vector>

//type alias deceleration:
template <typename T>
using type = std::vector<T>;

int main(){

    //type instantiation:
    type<int> t;
}

你可以在函数内部声明类型别名。你所拥有的是一个模板别名。 - eerorika
@user2079303 没错。已经调整了问题。 - Trevor Hickey
1
根据当前的答案,“标准就是这样说”,您能否澄清一下问题是“为什么决定不允许这样做?”这正是我最初的理解。 - BoBTFish
2
请参阅EWG问题95CWG问题822。 "EWG未能找到足够的动机来支持此扩展"。 - T.C.
1
所以,因为他们“没有找到足够的动力”来允许它。 - BoBTFish
@BoBTFish。谢谢。显然标准是这样规定的。我想知道为什么语言存在这种限制。 - Trevor Hickey
1个回答

5

标准如此规定。

来自C++11标准(重点在我):

14 模板

2 模板声明只能出现在命名空间范围或类范围声明中。在函数模板声明中,声明符的最后一个组成部分不得是模板ID。[注意:该最后一部分可以是标识符、运算符函数ID、转换函数ID或字面量运算符ID。在类模板声明中,如果类名是简单模板ID,则该声明声明了类模板部分特化(14.5.5)。—end note]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接