无法从XXX**转换为const XXX**

Gis*_*way 6 c++ visual-studio

我在c ++中有非常简单的代码.当我在Visual Studio下编译时,会发生错误.

#include <stdint.h>
#include <time.h>
void func1(const uint8_t* data)
{
}

void func2(const uint8_t** data)
{
}
int main() 
{
    uint8_t* data1 = NULL;
    uint8_t** data2 = NULL;
    func1(data1);//OK
    func2(data2);//error C2664: cannot convert argument 1 from 'uint8_t **' to 'const uint8_t **'
}
Run Code Online (Sandbox Code Playgroud)

完整的错误消息是:

错误C2664:'void func2(const uint8_t**)':无法将参数1从'uint8_t**'转换为'const uint8_t**'

Usualy你不能将const XXX转换为XXX,但是从XXX到const XXX应该没问题,为什么会出现这个错误?

bam*_*s53 7

但从XXX到const XXX应该没问题

不,在这个具体的例子中这不可行.考虑:

int const x = 10; // implementation stores to read-only memory
                  // implementation crashes on writes to read-only memory

void foo(int const **ptr) {
  *ptr = &x;
}

int main() {
  int *p;
  foo(&p);
  *p = 12; // crash
}
Run Code Online (Sandbox Code Playgroud)

如果这是合法的,它会将'指向const'值的指针赋给'指向非const'对象的指针,因此可以对常量对象进行危险的写入.

为了转换为const,可以将const添加到上面添加最低const的类型中的每个级别(除了最顶层).

例如,它不容许用户转换int ******int ***const***,但它好将其转换为int ***const*const*const*.这也适用于volatile:您可以转换int ******int ***volatile*const*const*但不能转换int ***volatile***

类型系统中的这个规则保护我们不会错误地将const对象视为非常量,或者将volatile对象视为非易失性,如果我们真的想犯这个错误,那么我们必须使用const_cast.

foo(const_cast<int const **>(&p));
*p = 12; // crash
Run Code Online (Sandbox Code Playgroud)

使用const转换程序很好,编译器很乐意生成一个展示未定义行为的可执行文件.(实例)


修复foo()以允许它获取指向非const的指针:

void foo(int const * const *ptr) {
  *ptr = &x; // error, can't modify *ptr 
}

foo(&p); // conversion works fine
Run Code Online (Sandbox Code Playgroud)

防止foo()将'const'值的指针写入'指向非const'对象的指针.(实例)


您可能认为XXX到const XXX是可以的,因为最常见的情况,即使用单级指针:int *- > int const *,可以的并且也遵守上述转换规则.const在最高级别无关紧要,因为参数本身的更改不会逃避该功能.


aj.*_*lan 0

这是您的两个选择,这...

void func1(const uint8_t* data)
{
}

void func2(const uint8_t** data)
{
}
int main() 
{
    const uint8_t* data1 = NULL;
    const uint8_t** data2 = NULL;
    func1(data1);
    func2(data2);
}
Run Code Online (Sandbox Code Playgroud)

或这个...

void func1(uint8_t* data)
{
}

void func2(uint8_t** data)
{
}
int main() 
{
    uint8_t* data1 = NULL;
    uint8_t** data2 = NULL;
    func1(data1);
    func2(data2);
}
Run Code Online (Sandbox Code Playgroud)

  • 或者 `void func2(const uint8_t * const * data);` 可以用 `uint8_t**` 来调用。 (3认同)