解释:将'char **'转换为'const char **',转换会丢失限定符

时间:2012-04-30 12:48:26

标签: c++ casting const

  

可能重复:
  Implicit cast from char** to const char**

给出以下代码:

void foo( const char ** buffer );

void bar() 
{
    char * buffer;
    foo( &buffer );
}

为什么如果foo()函数有const char *参数,编译器在将char *变量传入其中时不会抱怨?但是在使用char **时,它无法将其转换为const char **?编译器是否在前一种情况下添加任何const限定符?

我已经阅读了C ++标准的4.4节,它让我更加困惑。

3 个答案:

答案 0 :(得分:4)

是的,您无法隐式地从T **转换为const T **,因为编译器无法再保证不会违反常量。

考虑以下代码(从C FAQ问题中借鉴了这个主题:Why can't I pass a char ** to a function which expects a const char **?):

const char c = 'x';
char *p1;
const char **p2 = &p1;  // 3
*p2 = &c;
*p1 = 'X';              // 5

如果编译器允许第3行,那么第5行将最终写入const对象。

答案 1 :(得分:2)

考虑一下:

char const someText[] = "abcd";

void
foo( char const** buffer )
{
    *buffer = someText;
}

void
bar()
{
    char* buffer;
    foo( &buffer );
    *buffer = 'x';
}

如果这是合法的,则可以修改const对象 没有干预const_cast。转换是被禁止的 因为它违反了常规。

答案 2 :(得分:1)

您可能会混淆const适用的间接级别。

char**可以被描述为pointer to a pointer to a character,而const char**可以被描述为pointer to a pointer to a constant character

因此,当我们以不同的方式撰写时,我们有pointer to A(其中A = pointer to character),我们有pointer to B(其中B = pointer to a constant character)。

显然现在(我希望)A和B是不同的类型,因为这样的A指针不能分配给指向B的指针(反之亦然)。