通用参考和常量
Posted
技术标签:
【中文标题】通用参考和常量【英文标题】:Universal Reference and constness 【发布时间】:2020-11-13 14:54:54 【问题描述】:此 C++ 代码无法编译,您收到错误“候选函数模板不可行:第一个参数 ('const int32_t' (aka '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);
【问题讨论】:
只需从代码的倒数第二行删除<int32_t>
,因为这有效地实例化了函数Func(int32_t&&)
。另一方面,如果你把它放在一边,你可以从模板参数推导中受益。
【参考方案1】:
当您拨打此电话时:
Func<int32_t>(i.Id);
您正在指定模板参数。这意味着Func
中的T&&
根本不被视为转发引用。相反,它只是一个右值引用,即int32_t&&
。正如编译器所说,将int32_t &&
绑定到int32_t const &
将丢弃const
限定符,并且调用不会编译。
另一方面,如果你不指定模板参数:
Func(i.Id);
那么T&&
确实是一个转发引用,推导出int32_t const &
,调用编译。
【讨论】:
以上是关于通用参考和常量的主要内容,如果未能解决你的问题,请参考以下文章