为什么即使在没有解析模糊的情况下也需要C ++“typename”?

时间:2011-10-13 12:56:20

标签: c++ standards language-design

  

可能重复:
  Use of typename keyword with template function parameters
  Use of typename keyword with typedef and new

我理解为什么C ++有typename个关键字。解析某些令牌序列,例如

qwert * yuiop;
asdfg(*hjkl)(zxcvb);

取决于某些标识符(在本例中为qwertasdfgzxcvb)是指类型还是值。因此,在模板中,有时需要告诉它,以便它可以解析模板定义。

template<class Qwert> void yuiop() {
    typename Qwert::asdfg * zxcvb;  // declare a pointer of type Qwert::asdfg
    Qwert::asdfg * hjkl;            // multiply Qwert::asdfg by hjkl
}

但是,在某些情况下,语法只能接受类型,但仍需要typename。

template<class Qwert> void yuiop(Qwert::asdfg) {
    Qwert::asdfg hjkl;
}

这不编译。似乎典型的编译器假设Qwert :: asdfg是变量或常量,因此抛出语法错误。但为什么呢?

  • 在第一行,解析上下文保证我们正在处理函数签名,而不是函数调用,而C ++(与C不同)不允许在没有类型的函数签名中声明参数,并且所以在开放式括号之后必须是一种类型。
  • 如果两个标识符并列在第二行,则第一个标识符必须始终表示类型。

我的问题的实质是:为什么C ++标准不允许在这样的情况下从解析上下文中解析类型/值歧义?

(注:the nearest thing I've found online to a standard在第301页底部附近说明了这一点。我不知道在这方面是否有任何实际标准不同。)

0 个答案:

没有答案