gpt4 book ai didi

c - 为什么下面给我一个从 double *** 到 const double*** 的转换错误

转载 作者:行者123 更新时间:2023-12-04 11:25:27 25 4
gpt4 key购买 nike

为什么它不能将 double *** 转换为 const double ***

void foo(const double ***d)
{


}


int main (int args, char*[] args)
{
double ***d;
/*initialize d */

foo(d);

}

最佳答案

如果相信您的 C 标记,gcc 会生成警告,因为您的示例和 const double * const * const * d 的类型不同。在 C++ 中,这是 OP 代码中的一个错误,但 slap-const-everywhere 方法是合法的。

编译器警告您的原因是指向指针(或进一步间接)的指针允许通过修改参数指向的位置将指针返回给调用者。

如果指针的目标被声明为 const,那么被调用的函数会期望它放在那里的值在返回时被视为 const。

T** 传递给 const T** 的一个更简单的例子说明了为什么这是一个错误:

void foo ( const char ** z )
{
*z = "A";
}


int main (int nargs, char** argv)
{
char* z = 0;
char** d = &z;

// warning in C, error in C++
foo ( d );

// bad - modifies const data
z[0] = 'Q';
}

const 在 C 中意味着数据不会改变。 const 在 C++ 中意味着数据不会公开更改 - C++ 对象中的可变数据可以更改。 C 编译器可以优化它的代码,以便它在某处缓存一些 const 数据,但是 C++ 编译器由于可能的可变性而不能这样做,所以有一个较弱的限制,你不能返回 const数据为非常量,如上所述。所以在 C++ 中,double*** 可以转换为 const double * const * const * d 作为额外的 const 防止返回非- 可修改的内存,但在 C 中,如果编译器优化对其他地方的内存的重复访问,它会生成警告和可能的错误。

关于c - 为什么下面给我一个从 double *** 到 const double*** 的转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1404738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com