c++ - 引用性与模板函数中的类型无关

标签 c++ c++11 typetraits

考虑以下短程序:

#include <type_traits>
#include <iostream>
using namespace std;

template <typename T>
void fn( T t ) {
    cout << "T is reference: " <<
        boolalpha << is_reference<T>::value << endl;
}


int main( void ) {
    int x = 0;
    int& r = x;
    fn( r );
}

运行这个程序,我得到:T is reference: false
会是解释吗?

最佳答案

C++ 2003 模板类型推导试图找到匹配的参数类型。如果你想将引用作为参数,你需要这样说并且可能适本地重载模板。更改引用实际上通常不是您想要的(尽管您可以删除推导​​类型的引用部分)。通常,引用类型实现的概念与用于值的概念完全不同。另请注意 r只是 x 的另一个名称用于类型推导和重载解析。

在 C++ 2011 中,您可以要求编译器保留更多的类型信息:当使用右值引用符号(即 T&& 对于模板参数 T)推导模板中的类型时,类型将被推导为是对左值适当应用 cv-qualiiiers 的引用,对非左值应用值类型。也就是说,推导的类型本质上取决于参数是否是一个临时对象(或者至少看起来像一个)。

关于c++ - 引用性与模板函数中的类型无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843354/

相关文章:

c++ - 无限 while 循环 - char 关闭不工作 C++

c++ - Glm VECTORIZE2_VEC 重新定义 XCode 警告

c++ - 强制派生自类

c++ - 如何检查下标运算符是否存在?

c++ - Visual Studio 中的 OpenCL - 我们可以编译一个 exe 来使用所有可能的 CPU OpenCL 可以获得所有 OpenCL 支持平台吗?

c++ - QThread:线程仍在运行时被销毁?

c++ - 仅当给出超过 n 个参数时,如何启用可变参数模板构造函数?

c++ - Boost 程序选项遍历 variables_map

c++ - 带智能指针的多态性

c++ - 类型特征以匹配指向集合的指针