C++ 为什么在声明中向值参数添加cv限定符

C++ 为什么在声明中向值参数添加cv限定符,c++,declaration,qualifiers,C++,Declaration,Qualifiers,我最近发现,可以在函数声明及其实现中的值参数中添加和删除cv限定符。例如: F.h F.cpp test.cpp 将调用f(inti)实现。因为它是按值复制的,所以我认为代码编译没有问题。但是,有人能想象这样一种情况吗?在这种情况下,将常量添加到上述声明中是非常有用的?为什么可能呢?也许有人可以提供一个更有用的应用程序?有些人喜欢在他们的定义中声明,他们不会更改参数,即使它只在本地可见。例如: void f(int); void f(int const); void f(int const x

我最近发现,可以在函数声明及其实现中的值参数中添加和删除cv限定符。例如:

F.h

F.cpp

test.cpp


将调用f(inti)实现。因为它是按值复制的,所以我认为代码编译没有问题。但是,有人能想象这样一种情况吗?在这种情况下,将常量添加到上述声明中是非常有用的?为什么可能呢?也许有人可以提供一个更有用的应用程序?

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

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

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

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

忽略函数参数的顶级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;
}

不过,有些人认为,如果定义的函数参数与声明的函数参数外观不同,这会让人反感。这是品味和风格的问题。限定参数的好处可能很小,尽管在记录您不打算更改变量方面对实现有一些价值。

我立即知道它没有被修改。但是声明
f(const int I)
是谎言。@DaBrain它真的是谎言吗?它接收了参数的副本,因此从外部角度来看,调用方无法知道参数是否被修改。@DaBrain,噢,抱歉。我没有抓住问题的重点
const
通常不在声明中,只放在定义中,因为它没有给前者添加任何值。因此const在实现中是有意义的,但是单是声明又如何呢?从用户的角度来看,真的有价值吗?唯一关心它是否改变的人应该是阅读身体的人。除非你真的在谈论定义,在这种情况下,这些不是你要找的机器人。@chris:“用户”要么看不到定义,要么如果她看到了,就会受益于文件中关于如何使用变量的意图。这是否意味着,作为一般准则,如果声明与定义分开,您应该始终跳过值参数的cv限定符,因为它们无论如何都会被忽略?@DaBrain:在声明中,肯定是这样,因为限定符不是接口的一部分。
#include "F.h"
f(0);
void f(int);
void f(int const);

void f(int const x) {
    x = 3; // ERROR!
}
int power(int val, int n, int base);

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