为什么typename不能与decltype()互换?

时间:2018-02-05 02:44:43

标签: c++14 decltype typename

对于给定的用法

template<typename T1> 
class node{

public:
using sp2node = shared_ptr<node<T1>>;
using r_sp2node = shared_ptr<node<T1>>&;

public:
r_sp2Node getN();

private:
sp2node N;

};

(1)

template<typename T1> decltype(node<T1>::r_sp2node) node<T1>::getN(){

       return N;

}

(2)

template<typename T1> typename node<T1>::r_sp2node node<T1>::getN(){

       return N;

}

(1)生成编译器错误:

error: missing 'typename' prior to dependent type name 
    'node<T1>::r_sp2node'

而(2)编译

有人可以解释上述两者之间有什么区别吗?

1 个答案:

答案 0 :(得分:1)

第一个例子有两个问题。

  • decltype(node<T1>::r_sp2node)中,从内到外阅读,编译器首先需要知道node<T1>::r_sp2node。它是一种类型,还是其他什么?这就是typename消歧器存在的原因,这就是错误消息的全部内容。
  • 第二个问题是decltype需要一些表达式,而不是类型。因此,即使您使用typename,它仍然无法编译。 (举个简单的例子,decltype(int)甚至不会编译。)

要具体回答这个问题,两者之间的区别在于第一个是无效的C ++,第二个是要走的路。