Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带常量和不带常量限定符的typedef_C++_C_Typedef - Fatal编程技术网

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
属性。

我认为混淆来自您使用的const关键字,这实际上意味着func3不会更改p所指的数据,而不是说func3将接受const TVPtr

如果您真的想将i的地址传递给func3,您可以这样进行转换

 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);