当前位置: 首页 > 知识库问答 >
问题:

为什么要明确选择左值-ref重载而不是左值的转发-ref重载?

薄高懿
2023-03-14

看看这两个重载函数模板:

template <class T>
int foo(T& x) {  // #1
  return 1;
}
template <class T>
int foo(T&& x) {  // #2
  return 2;
}

我按以下方式调用foo:

int i;
foo(i);  // calls #1

并明确选择了重载#1:https://gcc.godbolt.org/z/zchK1zxMW

这似乎是一种正确的行为,但我无法理解为什么会发生这种情况(实际上我有一些代码,但这并不是我所期望的)。

从过载分辨率:

如果任何候选函数是函数模板,则使用模板参数推断生成其专门化,并且此类专门化与非模板函数一样处理,除非在平局规则中另有规定。

好的,让我们生成专门化。对于#1来说,它很容易变成int foo(int

所以我希望看到一个模棱两可的调用,但这不会发生。谁能解释一下为什么?这里使用什么样的分界符来选择最可行的函数?

另请参见Slack中的相关讨论,其中有一些想法。


共有1个答案

赵智
2023-03-14

非语言律师的回答是,对于这个案件,有一条平局规则。

充分理解标准措辞以解码它需要一个简短的书籍章节。但是当推导出T

这样做是为了(a)使通用引用工作,而(b)如果您想单独处理左值引用,则允许您重载它们。

平局断路器来自模板函数重载“更专业”的排序规则。对于指针,T*优先于T的原因相同,即使T=Foo*T=Foo给出相同的函数参数。发生对模板参数的二次排序,并且T可以模拟T*这一事实意味着T*更专业(或者更确切地说不是,标准中的措辞很尴尬)。一个额外的规则说明T

 类似资料:
  • 当一个类具有 constexpr 成员函数并且该成员函数正在 constexpr 上下文中的 l 值对象上求值时,clang 和 gcc 不同意结果是否为 constexpr 值。为什么?是否有既不需要默认可构造性也不需要复制可构造性的解决方法? 当对象按值传递时,两个编译器都会成功编译。 Clang版本trunk,8,7: 和 gcc 版本主干,8.1、7.4:编译没有错误 https://go

  • 问题内容: 他们在React文档中说: React还支持在任何组件上使用字符串(而不是回调)作为ref prop,尽管 这种方法目前在大多数情况下都是传统的 。 https://facebook.github.io/react/docs/more-about- refs.html 请看以下示例: 为什么我更喜欢这个,而不是: ? 第二个例子看起来更加干净和容易。 是否存在不建议使用string方法

  • 这两个函数完全匹配。以下是该标准的引用: 标准转换序列S1是比标准转换序列S2更好的转换序列,如果 ... S1和S2是引用绑定(8.5.3),都不引用未使用ref限定符声明的非静态成员函数的隐式对象参数,S1将右值引用绑定到右值,S2将左值引用绑定。 这不意味着第二个更好吗? 更新: 有一个相关的问题。下面的代码是它的简化版本。

  • 编辑 如果我导入一个隐式的。但是,我有方法,它在第二种情况下触发错误,但在第一种情况下不触发。请告诉我如何正确定义这个方法,它通常在编译时不需要隐式。_

  • 在这个课程中,我们已经研究了几个不同的统计量,包括总编译距离,最大值,中位数和平均值。在关于随机性的明确假设下,我们绘制了所有这些统计量的经验分布。有些统计量,比如最大和总变异距离,分布明显偏向一个方向。但是,无论研究对象如何,样本均值的经验分布几乎总是接近钟形。 如果随机样本的性质是真的,不管总体如何,它都能成为一个有力的推理工具,因为我们通常不清楚总体中的数据。大型随机样本的均值分布属于这类性

  • 所以我正在使用PHP和MySQL制作一个简单的电影数据库。我有两张桌子: 电影 电影类型