通用参考和常量

Universal Reference and constness

本文关键字:常量 参考      更新时间:2024-09-29

这段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 &,并且调用编译。