带const且不带const限定符的类型定义
typedef with const and without const qualifier
typedef void* TVPtr;
typedef const void* CTVPtr;
const TVPtr func3 (const TVPtr p)
{
return p;
}
const void* func4 (const void* p)
{
return p;
}
CTVPtr func5 (CTVPtr p)
{
return p;
}
int main ()
{
const uint64_t i = 10;
func3(&i); // compilation error here
// cannot convert argument 1 from 'const uint64_t *'
// to 'const TVPtr' Conversion loses qualifiers
func4(&i); // no compilation error
func5(&i); // no compilation error
return 0;
}
我不明白为什么有错误是一种情况,而不是在其他两个?
const TVPtr
不是const void*
,而是void* const
。换句话说,它不是指向const void
的指针,而是指向void
的const
指针。由于i
被声明为const
,它将很高兴绑定到const void*
,而不是void* const
,因为这将丢弃对象本身的const
属性。
const TVPtr
的意思是:
void * const //correct
不:
const void* //wrong
你似乎认为。
可视化有力量影响你的理解。
这就是为什么我认为把const
放在类型后面是一个更好的做法的一个原因。所以如果你有这样的做法:
void const * x;
不是const void * x; //same as void const *x!
那么它可以帮助定义类型和模板。
例如,取typepedef:
typedef void* voidptr;
现在,如果你写下面的代码,并试着想象它是什么:
voidptr const x;
那么你更有可能把它想象成:
void* const x; //correct
,这是事实。
在类型前加上const
是违反直觉的:
const voidptr x;
似乎是:
const void* x; //wrong
实际上是错误的-它仍然是:
void* const x; //correct
因此,将const
放在类型之后有助于可视化最终类型
func3期望非const类型,并承诺不通过实参列表中类型前面的const关键字更改它。因为CTVPtr是指向const数据的指针,所以其他函数可以接受指向const类型的指针。
我认为混淆来自于你使用的const关键字,这实际上意味着func3不会改变p所指向的数据,而不是说func3将接受一个const TVPtr。
如果你真的想把i的地址传递给func3,你可以像这样强制转换它
func3( (void*)&i);
相关文章:
- 在运算符重载定义中使用成员函数(const错误)
- 如何定义一个没有重复代码的继承的 const 类成员函数?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如何定义在编译时数据未知的 const 数组
- 具体来说,标准在哪里规定修改 const 对象是未定义的行为?
- 注意:"Entity_c::Entity_c(const Entity_c&)"被隐式删除,因为默认定义格式不正确:
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何键入用于const对象的自定义io操纵器
- 正在通过const-ref未定义的行为捕获新构造的对象
- 自定义链表const_iterator无法遍历列表的非const实例
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 如何检查函数是否真的获得了定义为 const 的变量?
- STL按客户"<"运算符对向量进行排序。为什么要将"<"运算符定义为 const?
- 为什么相同的函数签名只有区别,另一个通过 const 获取参数是重新定义?
- 明确定义'static const variable in a struct'对C++ 11 及以上有什么影响吗?
- C++ CMake 构建错误:未定义对"boost::throw_exception(std::exception const&)"的引用
- 如果我返回const定义的对象,为什么const关键字被取消资格
- 混合constexpr声明和const定义
- 只读内存映射寄存器在C中使用' volatile const '定义,但在c++中仅使用' volatile '