C++ 说明:转换';字符**';至';常量字符**';,转换将丢失限定符
可能重复:C++ 说明:转换';字符**';至';常量字符**';,转换将丢失限定符,c++,casting,constants,C++,Casting,Constants,可能重复: 给定以下代码: void foo( const char ** buffer ); void bar() { char * buffer; foo( &buffer ); } 为什么如果foo()函数有一个const char*参数,编译器在向其中传递char*变量时不会抱怨?但是当使用char**时,它无法将其转换为const char**?编译器是否在前一种情况下添加了const限定符 我已经阅读了C++标准的第4.4部分,它让我更加困惑。p> 是
给定以下代码:
void foo( const char ** buffer );
void bar()
{
char * buffer;
foo( &buffer );
}
为什么如果foo()
函数有一个const char*
参数,编译器在向其中传递char*
变量时不会抱怨?但是当使用char**
时,它无法将其转换为const char**
?编译器是否在前一种情况下添加了const
限定符
我已经阅读了C++标准的第4.4部分,它让我更加困惑。p> 是的,您不能将
T**
隐式转换为const T**
,因为编译器无法再保证不会违反const
考虑以下代码(借用了C FAQ中关于此主题的问题:):
如果编译器允许第3行,那么第5行将最终写入一个const
对象。考虑:
char const someText[] = "abcd";
void
foo( char const** buffer )
{
*buffer = someText;
}
void
bar()
{
char* buffer;
foo( &buffer );
*buffer = 'x';
}
如果这是合法的,则可以修改const对象
没有中间的const\u cast
。禁止转换
因为它违反了const ness。您可能混淆了const所适用的间接性级别
char**
可以描述为指向字符指针的指针,而const char**
可以描述为指向常量字符指针的指针
因此,当我们以不同的方式编写时,我们有指向A的指针(其中A=指向字符的指针
),也有指向B的指针(其中B=指向常量字符的指针
)
很明显,现在(我希望)A和B是不同的类型,因为这样一个指向A的指针不能分配给指向B的指针(反之亦然)。如何修改上述代码以正确编译?@MarkP,foo(const_cast(&buffer))代码>应该可以工作。这对我来说很奇怪,但标准允许const_cast
在任何方向的不同cv限定类型之间进行转换。因此,您可以通过它删除const
限定,也可以根据需要添加限定。
char const someText[] = "abcd";
void
foo( char const** buffer )
{
*buffer = someText;
}
void
bar()
{
char* buffer;
foo( &buffer );
*buffer = 'x';
}