为什么在声明中添加cv-qualifiers值参数

时间:2014-01-15 20:37:49

标签: c++ declaration qualifiers

我最近发现你可以在函数声明及其实现中从值参数中添加和删除cv-qualifier。例如:

F.h

f(const int i);

F.cpp

f(int i) { i++; }

TEST.CPP

#include "F.h"
f(0);

将调用f(int i)实现。由于它是按值复制的,我发现代码编译没有问题。但是,任何人都可以想象一个案例,如上所述,将 const 添加到声明中是有用的吗?为什么可能呢?也许有人可以提供更有用的应用程序?

2 个答案:

答案 0 :(得分:3)

忽略函数参数的顶级CV限定符,即它们不是函数签名的一部分。相反,如果您愿意,它们是函数的实现的一部分,因为它们限定了与形式函数参数对应的本地变量。因此,如果您满意,您可以在函数定义中限定函数参数:

int power(int val, int n, int base);

int power(int val, int n, const int base)
{
    while (n --> 0) val *= base;
    return val;
}

如果定义具有来自声明的不同外观的函数参数,有些人会发现它令人反感。这是品味和风格的问题。限定参数的好处可能很小,但在记录您不打算更改变量时,实现有一些价值。

答案 1 :(得分:0)

有些人喜欢在他们的定义中声明他们不会更改参数,即使它只在本地可见。例如:

void f(int);
void f(int const);

void f(int const x) {
    x = 3; // ERROR!
}

定义是刚刚声明的函数,即签名没有变化(好吧,除非您碰巧使用Sun的CC实际上将const考虑到了错误的名称,但这只是一个错误)。所有三个签名都声明完全相同的函数,const仅影响定义的主体(如果在定义的声明中使用它)。