찾다

 >  Q&A  >  본문

关于C++模板实参推断的疑问

在C++ Primer中第16章第5节有讲到:

//原始的、最通用的版本
template <class T> struct remove_reference {
typedef T type;
};
template <class T> struct remove_reference<T&>//左值引用
{typedef T type;}
template <class T> struct remove_reference<T&&>//右值引用
{typedef T type;}
int i;
//decltype(42)为int,使用原始模板
remove_reference<decltype(42)>::type a;
//decltype(i)为int&,使用第一个(T&)部分特例化版本
remove_reference<decltype(i)>::type b;
//decltype(std::move(i))为int&&,使用第二个(即T&&)部分特例化版本
remove_reference<decltype(std::move(i))>::type c;

为什么decltype(i)是int&,难道不应该是int吗?这好像与C++ Primer第二章讲decltype时说的不一样啊?

PHPzPHPz2810일 전826

모든 응답(1)나는 대답할 것이다

  • 高洛峰

    高洛峰2017-04-17 15:27:58

    gcc 6.2는 int입니다.
    C 사양이 어떻게 작성되었는지는 모르겠지만 gcc 6.2에서의 테스트는 int&가 아니라 int입니다.
    int&로 추론되면 여기에 구문 오류가 있는 것입니다.
    왜냐면

    으아악

    회신하다
    0
  • 취소회신하다