首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数声明中的const关键字位置

函数声明中的const关键字位置
EN

Stack Overflow用户
提问于 2013-01-09 17:46:45
回答 5查看 4.1K关注 0票数 9

可能重复: Difference between const declarations in C++

代码语言:javascript
复制
#include <iostream>

class Bar{};

void foo(const Bar x){}  //l5
void foo(Bar x){}        //l6
void foo(Bar const x){}  //l7

////pointer functions

void foo(const Bar* x){} //l11
void foo(Bar* x){}       //l12
void foo(Bar* const x){} //l13

编译器输出:(长话短说的l5l6l7冲突;但只有l12l13冲突)

代码语言:javascript
复制
untitled.cpp:6:6: error: redefinition of ‘void foo(Bar)’
untitled.cpp:5:6: error: ‘void foo(Bar)’ previously defined here
untitled.cpp:7:6: error: redefinition of ‘void foo(Bar)’
untitled.cpp:5:6: error: ‘void foo(Bar)’ previously defined here
untitled.cpp:13:6: error: redefinition of ‘void foo(Bar*)’
untitled.cpp:12:6: error: ‘void foo(Bar*)’ previously defined here

怎么回事?

  1. 每项声明的意义是什么?
  2. 为什么所有3个声明都与对象函数冲突,而只有2个声明与指针函数冲突?
  3. 请详细说明l12l13之间的冲突,即使l12不包含const关键字。
  4. 真的很抱歉如果琐碎的问题
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-01-09 18:04:37

“问题”是参数值的const不参与重载!

首先,Bar constconst Bar的含义已经相同,因此它们会自动出现问题。但是作为函数参数,const不适用于重载,因此函数的Bar版本看起来也是一样的。参数表中的const只告诉编译器,您不打算在函数体中修改它。

出于同样的原因,Bar*Bar* const被同等对待:const应用于参数的值(而不是指向的值),并且不参与重载,因此定义了相同的函数。

另一方面,const Bar*意味着完全不同的东西:指向const对象(Bar类型)的非const指针。由于类型不同,它确实参与重载,并允许该函数是唯一的。

票数 6
EN

Stack Overflow用户

发布于 2013-01-09 17:58:19

基本上,因为C++在调用函数时复制值,所以没有什么可以从调用者的角度区分前三个值。(调用方知道函数不能更改它自己传入的值,因此从调用方的角度来看,每个函数参数在很多方面都是隐式不变的)。

然而,当您谈到指针时,如果将指向常量的指针传递给非常数的指针,则调用方会有不同之处(一个不会更改您的内容,另一个可能会)。这就是为什么l11和l12不冲突的原因。

但是,l12和l13之间存在冲突,因为它们都是指向Bar*的指针(一个是const指针,另一个不是,所以与l5-l7一样,调用方没有区别)。

最后一点可能有点棘手--注意,虽然int const *aconst int *a相同,但它们与int * const a不一样,前两个是指向常量int的指针,另一个是指向int的常量指针(即指针的值在后面不能更改)。

票数 1
EN

Stack Overflow用户

发布于 2013-01-09 17:57:26

前三个创建冲突的原因是编译器无法确定在任何情况下使用哪个函数。当您调用foo(BarObject);时,编译器可以很好地使用它们中的任何一个,不管是否声明为const

但是,对于以参数作为指针的对象,当调用foo(BarPointer); (如果BarPointer声明为const Bar* BarPointer; )时,编译器将选择]11,因为它确保指向的对象不会在函数中被修改(在按值传递时不会像前三次那样)。如果不是const,则不知道应该调用]12还是]13,因为Bar* const x的意思是,"x不能指向传递为参数的其他任何东西“,这与调用方无关。

略为提及这些声明:

代码语言:javascript
复制
const Bar x // x is an immutable copy of the original parameter.
Bar const x // same as above and gets compiled, but cdecl says it is a syntax error.

const Bar* x // x points to an object that can't be changed.
Bar* const x // x can't point to any other object than the parameter passed.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14243269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档