关于C++模板实参推断的疑问
本文介绍了关于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时说的不一样啊?
解决方案
gcc 6.2是int
。
C++规范怎么写的我不知道,但是我在gcc 6.2下测试是int,而不是int&。
如果推导出来是int&
,那这里就有语法错误。
因为
remove_reference<decltype(i)>::type b;
// 如果前面推导出来是 int& ,那么 b 引用谁呢?
这篇关于关于C++模板实参推断的疑问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文