某些内容可以绑定到非常量引用但不能绑定到常量引用的情况

A case where something could bind to a non-const ref but not to a const ref?

本文关键字:常量 引用 绑定 但不能 情况 非常      更新时间:2023-10-16

>最小问题

请考虑以下功能:

class NonTrivialClass { /* ... */ };
void f1(NonTrivialClass      &) {}
void f2(NonTrivialClass const&) {}

是否有一个表达式调用f1,其中不能用f2替换f1

上下文

在工作机会的前景中,我被要求"编写方法double approx(vector<Point>& pts)">(Point给出(,该方法使用pts中的点以类似布冯的方式近似已知常数。

我写了一个定义double approx(vector<Point> const& pts)的实现(注意const(。由于尚未确定的原因,我未能通过测试!

在删除了所有可能的解释之后,我对测试平台和那个扣人心弦的const限定符产生了怀疑......他们的测试程序是否有可能适用于double approx(vector<Point>& pts)但不适用于double approx(vector<Point> const& pts)

如果你的问题承认疯狂的答案:

struct NonTrivialClass {};
struct NonTrivialClass2 {
    operator NonTrivialClass&();
    operator NonTrivialClass const&();
};
void f1(NonTrivialClass      &) {}
void f2(NonTrivialClass const&) {}
int main()
{
  NonTrivialClass2 foo;
  f1(foo);
  f2(foo); // error: reference initialization is ambiguous
}

当然,这不适用于vector<>的情况(除非测试机器通过某种"测试器"对象,其中包含损坏的(可能是模板化的,sfinae-unfriendly-whatever(将运算符转换为某个包裹的向量成员? 似乎不合理...但并非不可能(

如果有这样的表达方式(除了f2因任何原因无法访问的情况(,那将完全破坏我自己的C++知识......

我认为更有可能的是,您在函数中实现了导致失败的最小错误(您尚未意识到(;但是,不能排除测试评估软件足够愚蠢,只是为了寻找修复程序,给定签名,无论您的是否兼容......