通用参考和常量

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);

【问题讨论】:

只需从代码的倒数第二行删除&lt;int32_t&gt;,因为这有效地实例化了函数Func(int32_t&amp;&amp;)。另一方面,如果你把它放在一边,你可以从模板参数推导中受益。 【参考方案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;,调用编译。

【讨论】:

以上是关于通用参考和常量的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - NSError 参考:常量和代码

`ldstr` 指令使用哪种类型的常量?

通用 lambda 及其作为常量表达式的参数

字符常量和字符变量有啥区别?

PHP 特征 - 定义通用常量

为啥 const 模板参数不是通用/转发参考