某些内容可以绑定到非常量引用但不能绑定到常量引用的情况
A case where something could bind to a non-const ref but not to a const ref?
>最小问题
请考虑以下功能:
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++知识......
我认为更有可能的是,您在函数中实现了导致失败的最小错误(您尚未意识到(;但是,不能排除测试评估软件足够愚蠢,只是为了寻找修复程序,给定签名,无论您的是否兼容......
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 通过常量引用传递参数的矩阵模板类
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么常量方法可以采用非常量引用?
- 为什么当我们有常量引用时创建临时对象?
- 如何返回向量的常量引用?
- C++:常量引用参数
- 不同于按值传递和常量引用传递的程序集
- 为什么const_cast和static_cast常量引用没有效果?
- C++ 获取函数在常量引用中按值返回的结果
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- C++ 在类中使用常量引用文本时 O2 内存泄漏
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 通过非常量引用参数修改常量引用参数
- 将常量引用传递给线程
- 为什么C++中没有常量引用,就像常量指针一样?