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

浏览:44日期:2023-03-28

问题描述

在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时说的不一样啊?

问题解答

回答1:

gcc 6.2是int。C++规范怎么写的我不知道,但是我在gcc 6.2下测试是int,而不是int&。如果推导出来是int&,那这里就有语法错误。因为

remove_reference<decltype(i)>::type b;// 如果前面推导出来是 int& ,那么 b 引用谁呢?

相关文章: