为什么c ++模板参数应该声明为类类型?

Mei*_*Mei 4 c++ syntax templates language-lawyer

功能模板的语法

template <**class** T, ...>
    returntype functionname(arguments)
    {
           .....
           .....
     }
Run Code Online (Sandbox Code Playgroud)

我有两个问题?

  1. 为什么模板参数应该声明为类类型?(即使用class关键字)
  2. 当我们将它声明为类类型时,编译器会做什么?

Mat*_*lia 11

这是一般的混乱,从的使用产生classtemplate争论.

class件事与班级无关; 它只是说模板接受一个类型模板参数(而不是整数1模板参数),它可以是任何类型,而不仅仅是类.

那么,他们为什么选择class呢?因为他们必须使用一个肯定不会在任何C++程序中使用的关键字,或多或少"听起来不错" - 并且class没关系,因为它已经是C++中的保留关键字.

请注意,有一个替代class:typename关键字.它们完全相同2,但typename在我看来更清楚,因为这个名字只是说"接下来是一个类型论证",而不会让你认为它必须是一个类.

为什么允许两种语法?因为typename这个关键字,不要在语言推出(当他们发现,这是有必要添加另一个关键字来消除歧义模板内的一些声明); 然后,它也为template参数声明"改装"了.class保留关键字的这种用法是为了与同时编写的程序/文档兼容.


  1. 这里我说简单的"积分",显然我的意思是非类型模板参数(C++ 11,§14.14).
  2. template-parameter中的class和typename之间没有语义差异.

    (C++ 11,§14.12)