给出以下代码:
void foo( const char ** buffer );
void bar()
{
char * buffer;
foo( &buffer );
}
为什么如果foo()
函数有const char *
参数,编译器在将char *
变量传入其中时不会抱怨?但是在使用char **
时,它无法将其转换为const char **
?编译器是否在前一种情况下添加任何const
限定符?
我已经阅读了C ++标准的4.4节,它让我更加困惑。
答案 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的指针(反之亦然)。