当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《不使用'&',C++模板无法推断引用类型》经验,为你挑选了2个好方法。

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

#include 

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

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

在这种情况下,我是否被迫在函数参数中使用'T&'?Cuz我在一些教程中读到模板可以正确地推导出适当的数据类型,包括T*,T []或T&只需在变量之前定义一个简单的'T'.救命?



1> Ami Tavory..:

是的,要获得您想要的效果,您必须添加&符号.

在编写时,模板可以正确推断数据类型.但是,他们可以推断出意图.在这种情况下,传递它的类型是一个整数,并且它正确地实例化一个整数函数,该函数在内部将按值传递给它的参数加倍.您认为函数具有副作用的事实不是编译器可以猜到的.


虽然这个答案肯定是正确的,但应该注意的是,即使`a`的类型实际上是`int&`,`T`仍然会被推导为`int`.不幸的是,我认为没有一种正确而简洁的方式来陈述C++类型的演绎规则.

2> 小智..:

你确实可以用plain来正确推导出引用类型T.不幸的是,这并不意味着你认为它意味着什么.

特定

template  struct S { };
template  void f(S) { }
int main() { f(S{}); }

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

问题是,你的情况,推断Tint已经产生了非常有效的作用.也许是略微过度简化,但类型推导产生最简单T的调用工作.在您的情况下,T = int使呼叫工作.不是你希望它的工作方式,但编译器无法知道.T = int &也可以使呼叫工作,但它不是最简单的T使它工作.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有