某些东西可以绑定到非const ref而不是const ref的情况?

时间:2018-01-10 10:03:43

标签: c++ reference const signature

最小问题

请考虑以下功能:

class NonTrivialClass { /* ... */ };

void f1(NonTrivialClass      &) {}
void f2(NonTrivialClass const&) {}

是否有一个调用f1的表达式,其中一个人无法用f1替换f2

上下文

在提供职位的前景中,我被要求“编写方法double approx(vector<Point>& pts)Point被给予),该方法使用{{1以类似布冯的方式近似已知常量。

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

在删除所有可能的解释之后,我对测试平台和那个扣人心弦的const限定符表示怀疑......他们的测试程序是否可能与const一起工作但不是double approx(vector<Point>& pts)

2 个答案:

答案 0 :(得分:5)

如果你的问题得到了疯狂的回答:

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不友好) - 无论如何将操作符转换为某个包装的向量成员?似乎不合理......但并非不可能)

答案 1 :(得分:1)

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

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