Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';常量方法是否返回非常量引用?_C++_C++11_Reference_Constants_Const Cast - Fatal编程技术网

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”