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