3

可能重复:
从 char** 到 const char** 的隐式转换

给定以下代码:

void foo( const char ** buffer );

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

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

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

4

3 回答 3

5

是的,您不能从 a 隐式转换T **为 a const T **,因为编译器不能再保证不会违反 const-ness。

考虑下面的代码(借自关于这个主题的 C FAQ 问题:Why can't I pass a char **to a function which requires a const char **?):

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

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

于 2012-04-30T12:53:53.713 回答
2

考虑:

char const someText[] = "abcd";

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

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

如果这是合法的,则可以在没有干预的情况下修改 const 对象const_cast。禁止转换,因为它违反了 const-ness。

于 2012-04-30T12:55:42.617 回答
1

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

Achar**可以描述为,pointer to a pointer to a character而 aconst char**可以描述为pointer to a pointer to a constant character

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

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

于 2012-04-30T12:56:00.243 回答