提问者:小点点

普遍参照与恒常性


这个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);
}

共1个答案

匿名用户

当您拨打此电话时:

Func<int32_t>(i.Id);

您正在指定模板参数。这意味着func中的T&&根本不被视为转发引用。相反,它只是一个rvalue-reference,即int32_t&&。正如编译器所说的,将int32_t&绑定到int32_tconst&将丢弃const限定符,并且调用不会编译。

另一方面,如果不指定模板参数:

Func(i.Id);

那么T&&确实是一个转发引用,它推导出Int32_T const&,调用将编译。