说明:将“char **”转换为“const char **”,转换会丢失限定符。

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节,但它只让我更加困惑。
3个回答

5
是的,不能将T **隐式转换为const T **,因为编译器无法保证常量性不会被破坏。
考虑以下代码(从C FAQ关于此主题的问题借鉴而来:为什么我不能将char **传递给期望const char **的函数?):
const char c = 'x';
char *p1;
const char **p2 = &p1;  // 3
*p2 = &c;
*p1 = 'X';              // 5

如果编译器允许第三行代码,那么第五行代码将会写入一个常量对象。

2
你会如何修改上述代码以使其能够正确编译? - MarkP
1
@MarkP,foo(const_cast<const char **>(&buffer)); 应该可以工作。对我来说很奇怪,但标准允许 const_cast 在任何方向上转换具有不同 cv 限定符的类型。因此,您可以通过它删除或添加 const 限定符。 - 23W

2

请考虑:

char const someText[] = "abcd";

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

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

如果这是合法的,那么就可以在没有const_cast的情况下修改一个常量对象。但是这种转换被禁止,因为它违反了常量性。

1

您可能混淆了const应用的间接级别。

char**可以描述为指向字符的指针的指针,而const char**可以描述为指向常量字符的指针的指针

因此,当我们以不同的方式编写时,我们有A的指针(其中A =指向字符的指针),我们有B的指针(其中B =指向常量字符的指针)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接