c++ - 返回值语法重载 const 和非 const 函数

标签 c++ c++11 auto decltype

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

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

相关文章:

c++ - 使用 memory_order_relaxed 进行存储,使用 memory_order_acquire 进行加载

c++ - 为什么有一个限制,c++ 'auto' 不能代表多种类型

c++ - 什么是自动括号列表语法?

c++ - `auto const& x `在C++中做什么?

c++ - QSignalMapper 可以转发函数参数吗?

c++ - 掩蔽和转移

c++ - 如何区分外接显示器和笔记本屏幕本身?

c++ - Boost::Graph 中的 read_graphviz(),传递给构造函数

c++ - 如何接受通用迭代器?

c++ - 为什么 std::array<int, 10> x 不是零初始化但 std::array<int, 10> x = std::array<int, 10>() 似乎是?