这在GCC 8.2上可以正常编译:
class M
{
public:
const Pointer* getPointer() const {return _ptr;}
private:
Pointer* _ptr{nullptr};
};
但是当我向函数添加另一个const时:
class M
{
public:
const Pointer* const getPointer() const {return _ptr;}
private:
Pointer* _ptr{nullptr};
};
我收到编译器错误:
error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
为什么不让我添加额外的常数?从什么时候开始,额外的const不好?
答案 0 :(得分:7)
因为像这样按值返回const
都没有区别。
例如:
const int GetMyInt()
{
int k = 42;
return k;
}
//later..
int ret = GetMyInt();
// modify ret.
因为从GetMyInt
返回的值无论如何都将被复制到ret
中(不考虑(N)RVO),因此GetMyInt
返回const
没什么区别。
通常这是一个警告,因为它是多余的代码,但是-Werror
会将每个警告变成一个错误,因此就可以了。
答案 1 :(得分:5)
const
限定符在此位置无效,因为返回的值是非类类型的prvalue,因此无论如何都不能修改。
请注意,编译器消息中显示-Werror=
,这意味着它通常是警告(因此代码没有错,但值得警告)。您的编译设置已将其转换为错误。