模板引用类型推导
Template references type deducion
本文关键字:引用类型 更新时间:2023-10-16
我有一个模板函数:
template<typename T>
void doSomething(T& value) {
// doSomething here
}
一切正常,但传递 r 值引用:
doSomething(getTempVal());
产生no matching function for call
错误,因为特定的实例化函数模板expects an l-value for 1st argument
。是否有任何解决方法可以允许模板函数在不添加新模板的情况下同时采用左值和右值引用?
是的,只需使用 &&
而不是 &
。
这可能看起来很奇怪,因为您可能认为这将不允许使用左值调用它,但实际上,如果T
本身是左值引用类型,那么T &&
只是T
:它不会成为右值引用类型。
换句话说,
template <typename T>
void f(T &&);
int main() {
int k = 1;
f(k); // okay: calls f<int&>
f(2); // okay: calls f<int>
}
请注意,T
可以推导为引用类型,并且需要使函数体来处理它。
相关文章:
- 强制转换为引用类型
- 自定义引用类型
- Java 中是否有类似于 C++ 中引用类型"&"的内容?
- 为什么我不能在运算符=中使用引用类型?
- 可变参数模板函数参数和引用类型推导
- 隐式可转换参数,但属于引用类型
- 如何告诉自动推断向量<bool>元素的非引用类型
- 为什么"const auto [x, y]"绑定到引用类型时没有按预期运行?
- 引用类型的数据成员提供有关恒常正确性"loophole"
- 为什么引用类型在使用临时对象访问时是左值
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 在 lambda 中从引用类型捕获的值的类型,不使用通用捕获
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- void*作为通用引用类型是如何工作的
- 强制转换为不相关的引用类型是否违反严格的别名规则?
- C++ 引用类型作为递归函数参数
- EXPECT_CALL具有 unique_ptr 引用类型参数的模拟函数
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 为什么模板引用类型不能用作模板类型别名参数?
- 模板默认参数将丢失其引用类型