以const和const结尾的getter之间的区别

问题描述 投票:12回答:1

我已经看过Nicolai Josuttis(C ++标准委员会成员)的talk(确切的时间戳,他没有解释),他说吸气剂应该这样写:

const std::string& getName() const&
{
     return memberStringVar;
} 

自从C ++ 11以来。问题是,与这个吸气剂相比有什么不同?

const std::string& getName() const
{
     return memberStringVar;
}
c++ getter
1个回答
7
投票

在谈话中给出的例子中,给出了getName()的两个重载。一个是&&,另一个是const&预选赛。

&之后没有const,函数const std::string& getName() const不能超载rvalues string Customer::getName() &&的重载。

如果您希望它能够工作,那么您必须完全从代码中删除rvalue重载。

由于ref限定成员函数仅在C ++ 11中添加(使rvalues的getter成为可能),因此需要从const std::string& getName() constconst std::string& getName() const&的更改才能使两个重载成为可能。

C ++ 17标准草案n4659规定:

16.1可重载声明[over.load] ...

2某些函数声明不能​​重载: ... (2.3) - 具有相同名称和相同参数类型列表的成员函数声明以及具有相同名称的相同成员函数模板声明,相同的参数类型列表和相同的模板参数列表(如果其中任何一个都不能重载)但并非所有人都有一个参赛资格赛。

由于getName()有一个带有ref-qualifier(&&)的重载,另一个也应该有ref限定符。这就是为什么const&是必需的。

© www.soinside.com 2019 - 2024. All rights reserved.