2

我在使用新的返回值语法为 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'

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

4

3 回答 3

4

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

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

否则,您将返回对 non- 的引用,考虑到您的成员函数是-qualified 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&;
于 2013-06-12T13:45:15.267 回答
0

目前尚不清楚为什么“传统”方法不适合您的目的。

使用 decltype 和添加/删除技巧的诡计是为想要过于通用的模板掩盖基础。您必须处理未知类型和您无法控制的类型。

对于通常情况,只需添加一些 typedef 并直接使用它们就更清楚了。

对于您的尝试,IMO 您错误地使用了它,要么在前面尝试 const auto&,要么在前面尝试 auto 并在 -> 之后一直组装类型,结合 remove_reference,然后 add_const 然后 add_lvalue_reference,它可能会起作用,尽管会让人头晕目眩.

于 2013-06-12T13:50:08.720 回答
0

decltype(PhysicalNode::energySolver_)是普通的EnergySolverconst EnergySolver即使方法是const,因为表达式不使用this,这是该const限定符真正影响的。由于尚未完成,因此您不得decltype(this->energySolver_)在此上下文中使用。PhysicalNode

你必须做一些类似-> const decltype(PhysicalNode::energySolver_)&;-> std::add_lvalue_reference<std::add_const<decltype(PhysicalNode::energySolver_)>::type>::type;或介于两者之间的事情。

于 2013-06-12T13:43:35.117 回答