C++ 重载运算符两次,一次返回非 const 引用,另一次返回 const 引用,偏好是什么?

标签 c++ reference operator-overloading constants operator-keyword

我用相同的参数列表重载了一个运算符两次。但返回类型不同:

T& operator()(par_list){blablabla}    
const T& operator()(par_list){blablabla}

那么当我调用 () 运算符时,会根据什么偏好或情况调用哪个函数?我知道如果我在 const 函数下调用 () ,它必须是 const T& 。

我只是好奇 C++ 如何处理这种情况以及默认首选项如何工作。

谢谢

最佳答案

这些函数不会互相重载;它们具有相同的签名,因此尝试重新定义相同的函数,这是一个错误。返回类型不是函数签名的一部分。要重载一个函数,您必须声明另一个具有相同名称但参数不同或 const/volatile 限定符的函数 - 即函数上的限定符,而不是返回输入。

(它们也不会相互覆盖;覆盖是派生类对其基类的虚函数所做的事情)。

定义成员函数的const和非const重载是很常见的; const 重载必须声明函数 const,而不仅仅是返回类型:

T& operator()(par_list){blablabla}
const T& operator()(par_list) const {blablabla}
                              ^^^^^

现在,如果您将 () 应用于非 const 对象,则会调用第一个,而将第二个应用于 const 对象。例如:

Thingy nc;
Thingy const c;

nc(); // calls the first (non-const) overload
c();  // calls the second (const) overload

关于C++ 重载运算符两次,一次返回非 const 引用,另一次返回 const 引用,偏好是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12700682/

相关文章:

c++ - 在哪里可以看到库包含 LLVM 的哪些部分?

c++ - 具有两种类型的模板 vector

c++ - 模板化运算符 ==

c++ - 为什么不能从析构函数中抛出。例子

c++ - 将 double 转换为具有超过 5 个十进制数字精度的字符串

c++ - 关于 C++ 中的指针和引用的困惑

javascript - 引用使 ExternalInterface.call 调用 javascript 函数的 html 对象

c++ - &= 必须始终被解释为运算符吗?

c++ - 重载运算符 << 输出 bool 值。为什么?

c++ - 有什么合理的理由使一元运算符 & 过载?