C++ 为什么可以';常量方法是否返回非常量引用?
为什么下面的方法C++ 为什么可以';常量方法是否返回非常量引用?,c++,c++11,reference,constants,const-cast,C++,C++11,Reference,Constants,Const Cast,为什么下面的方法getRanks()无法编译,我如何才能优雅地修复它 我只想定义一个成员访问器方法,返回对成员的引用。引用不是const,因为我以后可能会修改它引用的内容。但是由于member方法不修改对象,所以我声明它为const。编译器(clang,std=c++11)坚持认为存在“删除限定符”的“引用绑定”。但我不会放弃预选赛,是吗?如果我是,为什么: struct teststruct{ vector<int> ranks; vector<int>&
getRanks()
无法编译,我如何才能优雅地修复它
我只想定义一个成员访问器方法,返回对成员的引用。引用不是const
,因为我以后可能会修改它引用的内容。但是由于member方法不修改对象,所以我声明它为const
。编译器(clang,std=c++11)坚持认为存在“删除限定符”的“引用绑定”。但我不会放弃预选赛,是吗?如果我是,为什么:
struct teststruct{
vector<int> ranks;
vector<int>& getRanks()const{
return ranks;
}
};
struct teststruct{
向量秩;
向量&getRanks()常量{
返回等级;
}
};
现在,如果我更改return语句以丢弃const,代码将编译:
return const_cast<vector<int>&>(ranks);
return const_cast(等级);
但是“等级”一开始就不应该是常数,我不明白为什么我需要把常数扔掉。我甚至不知道这样做是否安全
无论如何,有没有一个更干净的方法来编写这个方法?有人能解释为什么这么简单的常识方法失败了吗?我确实想声明
getRanks()
方法“const
”,以便可以从其他const
方法调用它 您正在返回对等级
的引用,该等级是teststruct
的成员。这意味着任何获得此引用的人都可以修改teststruct
对象的内部结构。所以const
是个谎言
不要丢弃
常量
。相反,决定是希望函数为const
并返回ranks
或const
引用的副本,还是希望函数为非const
并返回可变引用。如果需要,您可以始终同时拥有这两个属性。您将返回对列组
的引用,该列组是teststruct
的成员。这意味着任何获得此引用的人都可以修改teststruct
对象的内部结构。所以const
是个谎言
不要丢弃
常量
。相反,决定是希望函数为const
并返回ranks
或const
引用的副本,还是希望函数为非const
并返回可变引用。如果需要,您可以始终同时使用这两个限定符。它会删除限定符,因为您返回了对等级的引用。之后的任何代码都可以修改列组。例:
auto v = teststruct.getRanks();
v[1] = 5; //assuming v.size() > 1
您可以通过返回副本来解决此问题:
vector<int> getRanks() const
如果您希望列
即使在常量
对象中也可以更改,可以执行以下操作:
mutable vector<int> ranks;
可变向量秩;
它会删除限定符,因为您返回了对等级的引用。之后的任何代码都可以修改列组。例:
auto v = teststruct.getRanks();
v[1] = 5; //assuming v.size() > 1
您可以通过返回副本来解决此问题:
vector<int> getRanks() const
如果您希望列
即使在常量
对象中也可以更改,可以执行以下操作:
mutable vector<int> ranks;
可变向量秩;
秩
是常量
,因为封闭对象(*此
)是常量
,所以必须返回对标准::向量常量的引用
如果希望允许客户端修改向量(从而影响成员),则getter不应为const
。请注意,getter无论如何都是愚蠢的,因为秩
已经是公共数据成员。秩
是常量
,因为封闭对象(*this
)是常量
,所以必须返回对std::vector常量的引用
如果希望允许客户端修改向量(从而影响成员),则getter不应为const
。请注意,getter无论如何都是愚蠢的,因为ranks
已经是一个公共数据成员。const
成员函数背后的思想是您应该能够在const
对象上调用它们<代码>常量
函数无法修改对象
说你有课
class A
{
int data;
void foo() const
{
}
};
对象和函数调用上的和:
A const a;
a.foo();
在A::foo
内部,此->数据
被视为其类型是int const
,而不是int
。因此,您无法在A:foo()
中修改this->data
在您的示例中,getRanks()
中的this->ranks
类型被视为const vector
,而不是vector
。由于不允许将常量向量
自动转换为向量&
,因此当您将函数定义为:
vector<int>& getRanks()const{
return ranks;
}
const vector<int>& getRanks()const{
return ranks;
}
vector&getRanks()常量{
返回等级;
}
如果将函数定义为:
vector<int>& getRanks()const{
return ranks;
}
const vector<int>& getRanks()const{
return ranks;
}
const向量&getRanks()const{
返回等级;
}
由于const-vector
可以自动转换为const-vector&
因此const
成员函数背后的思想是您应该能够在const
对象上调用它们<代码>常量
函数无法修改对象
说你有课
class A
{
int data;
void foo() const
{
}
};
对象和函数调用上的和:
A const a;
a.foo();
在A::foo
内部,此->数据
被视为其类型是int const
,而不是int
。因此,您无法在A:foo()
中修改this->data
在您的示例中,getRanks()
中的this->ranks
类型被视为const vector
,而不是vector
。由于不允许将常量向量
自动转换为向量&
,因此当您将函数定义为:
vector<int>& getRanks()const{
return ranks;
}
const vector<int>& getRanks()const{
return ranks;
}
vector&getRanks()常量{
返回等级;
}
如果将函数定义为:
vector<int>& getRanks()const{
return ranks;
}
const vector<int>& getRanks()const{
return ranks;
}
const向量&getRanks()const{
返回等级;
}
因为常量向量
可以自动转换为常量向量&
,但请稍候。我刚才还以为是“const”