非成员函数不能有cv限定符。

73
在编写以下函数abs时,我遇到了错误:

非成员函数unsigned int abs(const T&)不能有cv限定符。

template<typename T>
inline unsigned int abs(const T& t) const
{
    return t>0?t:-t;
}

在去除函数的const限定符后,就没有错误了。由于我没有在函数内修改t,上述代码本应该编译通过。我想知道为什么会出现错误?

4个回答

138
你不希望修改 t 的意思在于 const T& t。结尾的 const 指定了你不会修改属于类 abs 的任何成员变量。
由于没有这个函数所属的类,你会收到一个错误提示。

答案似乎更准确,因为在函数add中,例如int add(const int a, const int b),我们不能使用const限定符,因为它不是成员函数。 - Vikram Ojha
1
@VikramOjha 这个问题涉及到两种不同的const(一种是在函数作为类成员时修改this指针,另一种是修改函数参数)。我认为我的回答和Bo的回答(你提供的那个)都解释了OP遇到问题的原因,只是用不同的措辞表达。顺便说一下,问题中提到的函数名是abs,只有一个参数,而不是你评论中提到的两个参数的add函数,所以我不确定这个信息是从哪里得来的。 - Attila

40

函数声明末尾的const修饰符适用于成员函数的隐藏this参数。

由于这是一个自由函数,没有this,因此不需要该修饰符。

t参数在参数列表中已经有了自己的const


16

成员函数上的cv限定符指定了this指针的间接类型为const(或volatile, const volatile),因此具有该限定的实例可以调用该成员函数。

自由函数(以及类静态函数)没有this指针。


点赞仅仅因为你解释了我正在寻找的“cv”。 - Andrew Falanga

3
众所周知,参数列表后面跟随的const关键字表示这是指向指针常量的指针。
有一个非成员函数,它不属于该类,因此在添加const相反端时会出现错误。
解决问题的方法是将其变成一个类成员函数或者删除const相反端上的const关键字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接