为什么c++函数重载时会忽略顶层const而保留底层const呢
这样设计有什么意义吗,能否给出实例来解释这样有什么好处
顶层const就是这个指针是常量,不能指向别的对象。但是可以改变指针指向的变量的值。
底层const表示这个指针指向的变量是常量,指针可以指向别的对象,但是在指针指向这个变量的时候,不能改变变量值。
形参如果是“顶层const”,那么也就是它不能指向别的对象。然而它指向不指向别的对象,都不会作用在调用者那里。
好比
int a=1;
foo(a);
void foo(int a) { a = 2; } //改变a,不会作用到调用者那个a
因此事实上忽略不忽略都是忽略了,既然如此,忽略了还能简化代码,提高性能,所以就忽略了。
因为形参有没有顶层const,都不会影响实参的值。 示例如下:
void f(const int a) { } // 值传递
void f(int *const p) { *p = 1; } // const修饰指针
//void f(int &ref) { ref = 1; } // 引用自带const
int main() {
int var = 0;
f(var);
f(&var);
}
对于底层const,修饰指针或引用所指向或绑定的对象。
当实参有const修饰,形参non-const,则c++将禁止non-const到const的隱式类型转换。
因此形参的底层const无法忽略,而顶层const可以被忽略。
上面的回答不对把。顶层const只是不能改变指针的指向,可以改变指向对象的内容。
这个例子也不恰当把,按这个意思,void foo(ini a)这种函数定义也没有意义。
求真正理解的大神重新解答下这个问题。
const int i=1; //i 是顶层const
int k = i; //k 不是const, 所以顶层const被忽略;
函数传参时是实参赋给形参
所以 func(const int i)
是用const i 的值赋给函数内的变量,所以const无了。
谁说会忽略的
const int a = 0;
int e = 0;
auto *b = &a;
const int *c = &a;
int *d = &e;
std::cout << typeid(b).name() << " " << typeid(c).name() << " " << typeid(d).name() << std::endl;
使用auto的时候就不会忽略,如果忽略的话就相当于获得了存了非底层const地址的底层const指针