Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 说明:转换';字符**';至';常量字符**';,转换将丢失限定符_C++_Casting_Constants - Fatal编程技术网

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';
}