C++ 在什么情况下,您会声明一个非引用、非指针类型的函数参数const?

C++ 在什么情况下,您会声明一个非引用、非指针类型的函数参数const?,c++,C++,我有以下功能声明: void fn(int); 此函数只有一个整型参数。现在,我可以通过传递一个非常量或常量整数对象来调用这个函数。在任何一种情况下,此函数都会将对象复制到其局部int参数。因此,对该参数的任何修改都将是函数的局部修改,并且不会以任何方式影响调用方的实际参数。现在我的问题是,在哪种情况下,我会将这个int参数声明为const类型?我认为没有必要如下声明此函数 void fn(const int); 这是因为参数无论如何都是通过值传递的,函数在任何情况下都不能修改参数。我理解,

我有以下功能声明:

void fn(int);
此函数只有一个整型参数。现在,我可以通过传递一个非常量或常量整数对象来调用这个函数。在任何一种情况下,此函数都会将对象复制到其局部int参数。因此,对该参数的任何修改都将是函数的局部修改,并且不会以任何方式影响调用方的实际参数。现在我的问题是,在哪种情况下,我会将这个int参数声明为const类型?我认为没有必要如下声明此函数

void fn(const int);

这是因为参数无论如何都是通过值传递的,函数在任何情况下都不能修改参数。我理解,通过声明一个参数常量,函数不能在其主体内修改它。但是,即使函数进行了修改,这里也没有缺点,因为参数是函数的本地参数。

有时模板是以一般方式编写的,最终会执行类似的操作。不过,通过函数模板参数推断,
const
往往会被丢弃


实际上是一个
常量
参数。它是一个指针,但在您的示例中是不可变的。(当然,
this
是一个关键字,而不是一个变量,一元
&
对它不起作用。)如果你想让一个参数有这样的行为,就声明它
const
,仅仅因为它是允许的,并不意味着它有意义

如果这会导致重载的行为稍有不同,我也不会感到惊讶,但我认为你基本上是对的——在函数之外没有什么好的理由去做它


一个可能的问题是,读者可能会感到困惑,他们可能会认为您是想要一个引用,但却忘记了“&”。

您是对的,对于调用方来说没有区别——它只在函数内部起作用。只要有可能,我宁愿添加
常量。在编写函数时,我在想“我想要这个参数,但无意修改它(即使只是在本地修改)”,编译器会让我保持诚实


在某些情况下,如果编译器知道变量是const(如循环限制),编译器可能会做更多的优化。

在C++访问中最喜欢的一个面试问题是通过值、传递指针和传递引用的区别。p> 在这种情况下,我们通过值传递,而这个值太int了,因此这无关紧要。但我不确定用户创建的类。在这种情况下,当编译器看到对象通过const值传递时,它可能会决定通过const引用传递它。现在的编译器是智能的,我不明白为什么他们不能做到这一点

>从C++规范:

不同的参数声明 只有在有或没有 常量和/或volatile是等效的。 也就是说,常量和volatile 每个参数的类型说明符 确定时忽略类型 正在声明哪个函数, 被定义的,被调用的

例如:

typedef const int cInt;

int f (int);
int f (const int);              //  redeclaration of  f(int)
int f (int) { ... }             //  definition of  f(int)
int f (cInt) { ... }            //  error: redefinition of  f(int)

在本例中,const与重载无关
void f(int)
void f(const int)
是相同的签名。对于读者来说,在语义上有或没有&,函数的行为是相同的,因此他们可以自由地假设他们想要的任何东西,并且他们不应该感到困惑。@Dennis-关于重载,感谢您的澄清。关于“语义行为相同”,这对于大型对象或具有可变缓存的逻辑常量类来说是有争议的。性能是语义的一部分。尽管如此,我还是有点同意——我想我的回答大多是下意识的,因为这是我没有做的事情,所以我希望它有问题;-)正是我的论点。我不相信
const
会在这种情况下改变任何优化,但它会阻止您(或未来的您)修改原本不需要修改的内容。这是一种静态断言。我对以后不想修改的任何变量都会执行相同的操作,例如
const auto area=width*height