C++ 带常量和不带常量限定符的typedef
我不明白为什么有一种情况是错误的,而另两种情况不是错误的C++ 带常量和不带常量限定符的typedef,c++,c,typedef,C++,C,Typedef,我不明白为什么有一种情况是错误的,而另两种情况不是错误的 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 () {
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
不是这:
void * const //correct
你似乎是这么想的
形象化可以影响你的理解。 这就是为什么我认为在类型之后放置
const
是一种更好的做法的原因之一。因此,如果您有这种做法:
const void* //wrong
而不是
void const * x;
然后使用typedef和template进行帮助
例如,以这个typedef为例:
const void * x; //same as void const *x!
现在,如果您编写以下内容并尝试将其可视化:
typedef void* voidptr;
那么你就更有可能把它想象成:
voidptr const x;
事实上就是这样
在类型违反直觉之前使用const
:
void* const x; //correct
似乎是:
const voidptr x;
这实际上是错误的——仍然是这样:
const void* x; //wrong
因此,在类型后放置
const
有助于可视化最终类型。const-TVPtr
不是const-void*
,而是void*const
。换句话说,它不是指向const void
的指针,而是指向void
的const
指针。由于i
被声明为const
,它将愉快地绑定到const void*
,而不是void*const
,因为这样会丢弃对象本身的const
属性。 void* const x; //correct
我认为返回类型没有问题,但是输入参数有问题。其次,为什么它适用于其他两个func调用func4、func5?我的情况是指针指向的任何东西都是常量,而不是指针是常量。使用
const void*
。您无法使用typedef并将其表示为const void*
。您可以为const void*
定义另一个typedef。您可以说一些可怕的话,比如const typename std::remove\u pointer::type*
,但是为什么不直接说const void*
@Nawaz呢?你刚才解释了为什么void const*
是个好主意,然后在评论中你建议const void*
>。>@MattMcNabb:好主意。在我看到阿披舍克使用const void*和其他有这种做法的人之后,我实际上是一个墨守成规的人。有时候,我会准确地说出他们想要什么来节省时间,尤其是当我已经说得够多的时候。为什么要将const TVPtr作为void*const?为此,我会编写TVPtr const。TVPtr
是一个指针,因此添加const
使其成为const
指针。它不会将const
ness注入类型中。这可能是您永远不应该在typedef后面隐藏指针的原因之一。
func3( (void*)&i);