模板中的右值引用和常量左值引用之间的重载
Overload between rvalue reference and const lvalue reference in template
我想根据参数是否是临时对象重载两个函数,所以我编写了这样的代码:
#include <iostream>
void f(int &&)
{
std::cout << "&&" << std::endl;
}
void f(const int&)
{
std::cout << "const &" << std::endl;
}
int main()
{
int i;
f(i);
f(i + 1);
}
它相应地输出:
const &
&&
但是,当我更改代码以使用这样的模板时:
#include <iostream>
template <typename T>
void f(T &&)
{
std::cout << "&&" << std::endl;
}
template <typename T>
void f(const T&)
{
std::cout << "const &" << std::endl;
}
int main()
{
int i;
f(i);
f(i + 1);
}
输出变为:
&&
&&
怎么了?使用模板时如何优化可移动的临时对象?
编辑:
实际上,这是我阅读 Primer 时C++测试代码。它说:
template <typename T> void f(T&&); // binds to nonconst rvalues
template <typename T> void f(const T&); // lvalues and const rvalues
经过我的实验,这本书似乎在这里犯了一个错误。
template <typename T>
void f(T &&)
{
std::cout << "&&" << std::endl;
}
使用通用转发引用,并允许任何具有引用折叠的类型。
您必须使用带有无推导上下文的T
将代码包装到结构中:
template <typename T>
struct helper
{
void f(T &&)
{
std::cout << "&&" << std::endl;
}
void f(const T&)
{
std::cout << "const &" << std::endl;
}
};
template <typename T>
void f(T &&t)
{
helper<typename std::decay<T>::type>().f(std::forward<T>(t));
}
现场示例
相关文章:
- 常量引用和引用之间的区别
- C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别
- 左值引用和右值引用之间的区别
- DLL 引用之间的区别?和用途?
- C++中的变量和引用之间的区别是什么
- 句柄、指针和引用之间有什么区别
- 未定义的引用-"a=-b;"之间是否存在差异和`a=-1*b;`和C++中的"a=0-b&
- 返回类型中 && 和没有引用之间的区别
- 如何在函数参数中的右值和右值引用之间进行区分
- 模板中的右值引用和常量左值引用之间的重载
- 作为自变量的右值引用和左值引用之间的差异
- c++中指针和引用之间的区别
- “迭代器”和“对元素的引用”之间的区别
- 基元引用之间的static_cast
- Go和C++中指针和引用之间的逻辑差异
- 引用和左值引用之间有什么区别吗
- 指针 (*) 和引用 (&) 之间的区别
- Lua注册表与轻用户数据和引用之间的区别是什么?
- 数组指针与数组引用之间的差异
- 在指针和引用之间进行转换