gpt4 book ai didi

c++ - 返回值语法重载 const 而不是 const 函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:23 26 4
gpt4 key购买 nike

我在使用新的返回值语法为 const 和非 const getter 函数提供正确重载时遇到问题。

在我的类 PhysicalNode 中,我定义了一个具有新返回值语法的 getter 函数。这是必需的,因为 getter 的返回类型取决于成员的类型。

class PhysicalNode {
private:
solver::EnergySolver energySolver_; ///< The energy solver of this node
//solver::EnergyMomentumSolver energySolver_
public:
auto getEnergySolver()-> typename
std::add_lvalue_reference<decltype(PhysicalNode::energySolver_)>::type;
}

但是我现在还想将此方法作为常量提供。

通常我会使用函数重载来定义我的 const 而不是那样的 const getter 函数。

class PhysicalNode {
private:
solver::EnergySolver energySolver_;
public:
const solver::EnergySolver& getEnergySolver() const;
solver::EnergySolver& getEnergySolver();
}

我试过下面的函数声明,但它不起作用:

   const auto getEnergySolver() const-> typename
std::add_lvalue_reference<decltype(PhysicalNode::energySolver_)>::type;

编译错误为:

PhysicalNode.cpp:72: error: invalid initialization of reference of type 
'std::__add_lvalue_reference_helper<LbmLib::solver::EnergySolver, true,
false>::type {aka LbmLib::solver::EnergySolver&}' from expression of type
'const LbmLib::solver::EnergySolver'

我需要如何定义函数声明才能将此函数定义为常量。

最佳答案

如果你真的真的想使用这个符号和标准类型特征,你应该这样写你的 const 重载:

auto getEnergySolver() const ->
std::add_lvalue_reference<
std::add_const<decltype(PhysicalNode::energySolver_)>::type
// ^^^^^^^^^^^^^^
>::type;

否则您将返回对非 const 的引用,考虑到您的成员函数是 const 限定的,这显然是错误的。

但是请注意,这里并不真正需要类型特征(如果 EnergySolver 只是一个常规类型而不是引用类型别名):

 auto getEnergySolver()-> decltype(PhysicalNode::energySolver_)&;
auto getEnergySolver() const -> decltype(PhysicalNode::energySolver_) const&;

但即使是decltype 也是不必要的。如果您的实际程序并不比您展示的示例复杂,这就足够了:

auto getEnergySolver()-> solver::EnergySolver&;
auto getEnergySolver() const -> solver::EnergySolver const&;

关于c++ - 返回值语法重载 const 而不是 const 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17067029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com