C++ 在重载中返回常量元素

C++ 在重载中返回常量元素,c++,operator-overloading,C++,Operator Overloading,我在一个类中被要求重载[],并返回常量和非常量字符: char * data_; char & operator [] (size_t index); const char & operator [] (size_t index) const; 我对这两者都有相同的实现,并且它可以编译,但我很确定我在这里遗漏了一些东西: const char & Array::operator [] (size_t index) const { return data_[ind

我在一个类中被要求重载[],并返回常量和非常量字符:

char * data_;
char & operator [] (size_t index);
const char & operator [] (size_t index) const;
我对这两者都有相同的实现,并且它可以编译,但我很确定我在这里遗漏了一些东西:

const char & Array::operator [] (size_t index) const
{
    return data_[index]; // todo: needs to be const?
}
如何确保返回的字符不可修改

如何确保返回的字符不可修改

返回类型
const char&
中的
const
可确保该字符不能通过返回的引用进行修改



但是,请注意,最好返回
char
(即,按值返回
char
,而不是对
const char
的引用)。当您有一个大对象(因为在许多情况下可以避免复制大量字节)或在泛型代码中(因为您不知道可能显示的所有类型的大小),但当返回已知的小对象时(事情不会比
char
小),返回常量引用非常有用,您只需按值返回即可。

请原谅这种奇怪的私人命名,以及它没有使用模板的事实,我无法更改标题:)这种命名并不奇怪。这很常见,事实上,我就是这么用的。您的实现是正确的,返回类型上的const确保返回值是const。请忽略我的注释。不知何故,我忽略了一个细节。您的重载返回了一个
const char&
,它已经放弃了将返回值用作l值的可能性。如果返回值是char&,那么我的评论在这里是适用的,但在这种情况下,我怀疑James的回答也会指出这一点:)我明白了。因此,在我的例子中,实现是相同的,但一旦这成为一个模板类(肯定会在本学期晚些时候发生),实现就会改变?在这种情况下,OP可能需要返回
[]的引用
以便返回的值可以用作
l值,从而使其显示在作业的左侧。是否将其粘贴在答案中?我想你的意思是我必须以某种方式返回一份推荐信?(根据这里的评论)@Als你确定吗?我不明白他为什么需要返回一个引用(即,为什么纯
char
不够好)。而且您无论如何都不能分配给
常量&
。@Als:a
常量字符&
也不能出现在分配的左侧。:-)