这个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&&
根本不被视为转发引用。相反,它只是一个rvalue-reference,即int32_t&&
。正如编译器所说的,将int32_t&
绑定到int32_tconst&
将丢弃const
限定符,并且调用不会编译。
另一方面,如果不指定模板参数:
Func(i.Id);
那么T&&
确实是一个转发引用,它推导出Int32_T const&
,调用将编译。