如果不使用 '&',C++ 模板无法推断引用类型

标签 c++ templates

这是一个非常简单的例子:

#include <iostream>

template<typename T>
void DoubleMe(T x) {
    x += x;
}

int main()
{
    int a = 10;
    DoubleMe(a);
    std::cout << a; //displays 10 not 20!
}

在这种情况下,我是否被迫在函数参数中使用“T&”?因为我在一些教程中读到,模板可以通过在变量前定义一个简单的“T”来正确推断出适当的数据类型,包括 T*、T[] 或 T&。帮忙?

最佳答案

您确实可以使用普通的 T 正确地推断出引用类型。不幸的是,这并不意味着您认为的意思。

给定

template <typename T> struct S { };
template <typename T> void f(S<T>) { }
int main() { f(S<int&>{}); }

f 的类型参数被正确推导为 int&

问题是,在您的情况下,将 T 推导为 int 已经产生了一个完全有效的函数。也许有点过度简化,但类型推导会产生使调用有效的最简单的 T。在您的情况下,T = int 使调用有效。不是您希望它工作的方式,但编译器无法知道。 T = int & 也会使调用工作,但它不是最简单的 T 使它工作。

关于如果不使用 '&',C++ 模板无法推断引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34495592/

相关文章:

c++ - 错误 : out-of-line definition of 'test' does not match any declaration in 'B<dim>'

c++ - 以字符串列表作为模板参数的模板静态类,如何在C++ 11上制作

c++ - 将 lambda 作为模板函数参数传递

c++ - 两个几乎相同的调用,一个有效,一个失败

python - 在 boost::python::import ("cv2"上得到异常 boost::python::error_already_set )

c++ - CMake "--target install"没有 "--build"命令行

c++ - 如何访问 C++ 中的匿名 union/结构成员?

C++ 静态和动态绑定(bind)行为

c++ - 是否以某种方式优化了对同一类成员的连续多次访问?

c++ - 为什么 C++ 模板让我绕过不完整的类型(前向声明)?