返回值语法重载const而非const函数

Return value syntax overloading const and not const function

本文关键字:const 而非 函数 重载 语法 返回值      更新时间:2023-10-16

我有一个问题,为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,而不是像这样定义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&;

不清楚为什么"传统"方法不适合您的目的。

使用decltype和add/remove技巧的机制是为了覆盖那些想要过于泛型的模板的基础。你必须处理未知类型和你无法控制的类型

在通常情况下,添加几个类型定义并直接使用它们会更清晰。

对于你的尝试,我认为你使用不正确,或者尝试const auto&在前面,或者auto在前面,然后在->后面组装类型,组合remove_reference,然后add_const然后add_lvalue_reference,它可能工作,尽管会让人头晕。

decltype(PhysicalNode::energySolver_)是普通的EnergySolver,而不是const EnergySolver,尽管方法是const,因为表达式不使用this,这是const限定符真正影响的。由于PhysicalNode还没有完成,所以不允许在这种情况下使用decltype(this->energySolver_)

你必须做-> const decltype(PhysicalNode::energySolver_)&;-> std::add_lvalue_reference<std::add_const<decltype(PhysicalNode::energySolver_)>::type>::type;或介于两者之间的东西