为什么不能将const X转换为X&?

时间:2017-05-04 07:49:56

标签: c++ reference const

我正试图理解并实现俄罗斯方块项目的常规正确性。

这是我在尝试添加常量问题时遇到的一个经常出现的问题。

我有一个(Piece)类,其中一个私有成员是

Point rotationCenter;

我正在尝试写一个这样的吸气剂:

inline Point & Piece::getRotationCenter() const
{
  return rotationCenter;
}

之前,我有相同的吸气剂,但不是作为const功能,并且正在工作。现在,我得到了C2240错误“无法将const Point转换为Point&”。

我该怎么做才能纠正这个问题?我应该在没有getRotationCenter的情况下离开const吗?

PS:我读了https://isocpp.org/wiki/faq/const-correctness作为教程。

2 个答案:

答案 0 :(得分:33)

  

为什么无法将spec1 test new cars check color check model check motor 转换为$row.Path = $path.InnerText.Replace("/Folder1/Folder2/folder3/folder4/","")

因为如果允许,以下危险代码变为有效:

usp_StoredProcedurename.prc,

fn_FunctionName.udf

File.sql
  

我该怎么做才能纠正这个问题?我应该在没有const X的情况下离开X &吗?

这取决于你的意图。如果可以修改返回的对象,则使成员函数为非const并返回const int x = 0; int& rx = x; // bind const variable to reference (to non-const) rx = 99; // oops, try to modify the const variable via the reference 。如果没有,则保留成员函数getRotationCenter并返回类型const。 const成员函数是指不会修改(或提供修改)对象(及其成员)的承诺。

答案 1 :(得分:13)

Point&个成员函数中,所有类数据成员都是const。您不能将非const Point&引用绑定到const成员数据,因此会出现编译器错误。

如果您不希望调用者修改const,则可以constconst返回。

rotationCenter

如果你确实希望调用者修改Point(我通常不推荐),请写两个重载:一个按const Point&返回,另一个按inline const Point & Piece::getRotationCenter() const { return rotationCenter; } 返回,具体取决于你称之为对象的资格:

rotationCenter