返回值语法重载const而非const函数
Return value syntax overloading const and not const function
我有一个问题,为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;
或介于两者之间的东西
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 为x86而非x64编译时出错
- 如何避免将 const 和非 const 成员函数输入到模板中的代码重复
- cpp 数组 - 分配常量索引有效,而非常量索引不起作用
- 与类而非对象绑定的可变变量
- 在C 中本地声明隐藏的封闭范围(而非全局)中访问变量
- 如何避免重复的const和非const虚拟函数?是否可以
- 避免使用 auto 关键字从字面上复制 const 和非 const 的代码?
- 适配器模式:支持可以是const或非const的基础数据,优雅
- 为什么我的运算符=(T&&)模板只绑定到一个const&而不是一个&&?
- 为什么在const和非const方法中删除代码重复不是不确定的行为
- 返回一个 const 和非 const 包装器对象
- 从C++二进制搜索树中删除一个节点(类而非结构)
- 在使用指向 const 和非 const 方法的成员指针时减少模板专用化的数量
- 从无序地图创建以自定义类作为键的地图.但是,由于const而无法使用的要素
- 尝试用C 中的空地址(而非null)删除数组指针
- 为什么BOOST.RANGE RANGE_BEGIN/END FREE功能对const和非const引用都重载
- 如果首先使用非常量初始化,为什么允许对 const 的非常量引用?
- 返回值语法重载const而非const函数