强制const-version优先级

force preference of const-version?

本文关键字:优先级 const-version 强制      更新时间:2023-10-16

假设我有

class A {
  double a;
  double Value() const {
    return a;
  }
  double& Value() {
    return a;
  }
}
//later:
A foo;
double b = foo.Value();

现在,将调用非const版本。是否有一种很好的方法来强制使用const版本?我觉得用演员也可以,但我觉得不太优雅。

您可以将其强制转换为const

double b = static_cast<const A&>(foo).Value();

(我不认为我曾经显式地将const添加到变量中。我不确定static_cast是否比const_cast更合适。

比强制转换更漂亮一点——赋值给const引用不需要显式强制转换:

A foo;
const auto& cfoo = foo;
double b = cfoo.Value(); // will use Value()const

在实践中,如果你在所有的函数参数中尽可能地使用const,那么你很可能会在某个时候将foo传递给bar(const A& x)

您可以使用代理完成您想要的:

class A {
  double a;
  class proxy { 
      A &a;
  public:
      proxy(A &a) : a(a) {}
      operator double() const { return a; }
      proxy operator=(double d) { a.a = d; return *this; }
  };
public:
  proxy Value() {
    return proxy(*this);
  }
}
// ...
double d = foo.Value();   // will use proxy::operator double.
foo.Value() = 1.0;        // will use proxy::operator=

这确实需要(内部)修改您的class A,但不需要修改使用它的代码。但是,它会将读取和写入成员数据的代码分开,因此您可以分别在每个代码上设置断点。

你不能做得很优雅,但最简单的是do define

class A {
...
const A * operator->() const
{
   return this;
}
}

并使用

foo->Value();
不是

foo.Value();
为const-version-only

从c++ 17开始,我们有std::as_const()为您将引用强制转换为const引用。例如:

#include <utility>
...
A foo;
double b = std::as_const(foo).value();