通用参考和常量
Universal Reference and constness
这段C++代码没有编译,您会得到一个错误"候选函数模板不可行:第一个参数('const int32_t'(又名'const int'((将丢失const限定符">
我知道我可以通过为Func(const T& value)
添加重载来解决这个问题,但我很好奇为什么它不能编译?
template <typename T>
void Func(T&& value)
{
// Do stuff
}
struct Obj
{
int32_t Id{};
};
int main(int argc, char* argv[])
{
const Obj i{};
Func<int32_t>(i.Id);
}
当您进行此调用时:
Func<int32_t>(i.Id);
您正在指定模板参数。这意味着Func
中的T&&
根本不被认为是转发参考。相反,它只是一个右值引用,即int32_t&&
。正如编译器所说,将int32_t &&
绑定到int32_t const &
将丢弃const
限定符,并且调用不会编译。
另一方面,如果您没有指定模板参数:
Func(i.Id);
则T&&
实际上是转发引用,它推导出int32_t const &
,并且调用编译。
相关文章:
- 为什么make_nvp需要非常量参考?
- 什么是常量参考参数以及如何使用它?
- 常量参考的正确语法
- 为什么双转换到看似任何原始的常量参考
- 为什么未调用具有常量参考返回值的超载方法
- 用整数值初始化非常量参考
- 为什么可以将其他类型变量用作C 中常量参考参数参数的参数
- 常量参考延长对象的寿命,然后是const_cast,这是一个好主意吗?
- 具有常量参考的可变参数模板专用化
- C 中的参考和常量混淆
- 完美的转发常量参考扣除错误
- 将计算结果保存到常量参考中
- 我如何安全地坚持使用C 常量参考
- 获取迭代器以供常量参考
- 通过常量参考临时延长寿命
- 与非常量参考参数交换
- c++棘手的常量参考考试任务
- 常量参考不"updated"
- 范围为循环常量参考似乎没有区别
- 常量参考和左值