【问题标题】: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);
}

【问题讨论】:

  • 只需从代码的倒数第二行删除&lt;int32_t&gt;,因为这有效地实例化了函数Func(int32_t&amp;&amp;)。另一方面,如果你把它放在一边,你可以从模板参数推导中受益。

标签: c++ c++11


【解决方案1】:

当您拨打此电话时:

Func<int32_t>(i.Id);

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

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

Func(i.Id);

那么T&amp;&amp;确实是一个转发引用,推导出int32_t const &amp;,调用编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2019-12-08
    • 1970-01-01
    相关资源
    最近更新 更多