我可以在指针类型声明中省略const限定符吗?
Can I omit const qualifiers in declaration for pointer types?
对于包含void foo(const int )
类型声明的函数定义,以下两个声明都有效。
void foo(const int); // valid
void foo(int); // valid, const can be omitted.
但是如果函数定义包含void foo(const int*)
类型的声明,省略const是非法的:
void foo(const int *); // valid declaration
void foo(int *); // error: const cannot be omitted.
为什么const
不能在函数声明中省略,如果它的参数有指针类型?是什么造成了差异?
只能在直接应用于形参时省略const说明符。在指针的情况下,它被应用于被指向的对象,而不是指针本身,所以在const和形参之间有一个额外的间接层。在这种情况下,您可以省略它:
void foo(int* const);
void foo(int*);
const int x
表示x
在函数内为只读。外部世界不在乎这两种情况;函数正在使用实参的副本。
然而,const int *p
意味着p
指向只读的东西。外部世界并不关心这个;这是一个不能修改指针的承诺。
由此推论,以下两个声明是等价的:
void foo(const int *);
void foo(const int * const);
函数处理传入参数的副本。如果它是整数,你可以忽略const
,因为原始的不会被触摸。对于指向int类型的指针,有三种选择:
-
int* p
-
const int* p
(或int const* p
) -
const int* const p
(或int const* const p
)
const
可以应用于有指向对象,指针本身或两者。作为参数传递的是指针,因此可以在将其副本传递给函数时省略const
。因此(2)和(3)可以互换使用(仅当用作函数参数类型时)。但是const
对于指向对象类型有区别:
-
void foo(const int* p);
//函数不能通过p 修改指向整数对象 -
void foo(int* p);
//函数可以通过p 修改指向整数对象
在这两种情况下,函数都可以修改函数内部的p
,但这些更改不会反映在原始指针的值上。
相关文章:
- 将const指针(EVP_MD)保存到变量中,以将其重新使用为类方法(HMAC)
- std :: allocator_traits ::用const指针构造
- 汇编问题试图使用qobject_cast进行const指针
- C++ 两个具有相互指向 const 指针的对象
- 我想将指向 const 对象的指针放入包含非 const 指针的容器中.我有什么选择
- 传统代码突变const指针.任何合法的原因
- C#等效于C 中的const指针
- 返回指向 const 数据成员和 'auto' 关键字的 const 指针。有点困惑
- 函数返回由const指针向量生成的指针
- 您如何使用成员正确初始化构造的结构,该构件是指向const值的const指针
- 使用 const 指针的 C 样式字符返回不正确的结果
- 有没有办法将 std::stack<pointer> 转换为 std::stack<const 指针>?
- 为什么当 typedef const 指针与额外的 const 一起使用时,编译器不会给出错误?
- 如何将const_cast的const指针向量映射到非常量指针向量
- 什么场景可能需要使用 需要 const 指针指向(非常量常量)数据
- 强制转换 const 指针以使用旧版 C 代码
- const ref 和 const 指针 c++ 之间的区别
- 将 const 传递给接受 const 指针的函数是不正确的
- 指向指针数组的Const指针
- C++Const指针声明