gpt4 book ai didi

c++ - 将 `const` CV 限定符应用于衰减数组样式 `T arr[]` 函数参数(旨在衰减到 `T * const arr` )

转载 作者:太空狗 更新时间:2023-10-29 23:43:39 24 4
gpt4 key购买 nike

首先我要指出这个问题纯粹是出于好奇,希望避免诸如

之类的讨论

"Consider staying away from new/dynamic arrays, and use fit-for-purpose stdlib containers instead, e.g. std::vector."

"Why would you want to use int arr[] parameter syntax on the first place? I always thought that it is considered to be one of the confusing abominations."


将数组样式的函数参数衰减到 T * const arr

如果我没记错的话,以下两个函数中的函数签名——旨在使用动态分配的 C 样式数组调用——由于衰减而等效,第一个参数是(显式或通过衰减)原始指向 int 的指针。

// A) mutable raw ptr to mutable elements
void foo(int * arr, unsigned n)
{
// ...
arr = nullptr; // legal
}

// B) mutable raw ptr to mutable elements
void foo(int arr[], unsigned n)
/* decays to int * arr */
{
// ...
arr = nullptr; // legal
}

// ... used e.g. as
int * arr = new int[3]{1, 2, 3}; // c++11
foo(arr, 3);
delete[] arr;

现在,假设出于某种原因,我们希望原始指针(已作为值的拷贝传递给函数)成为 const 指针(例如,为了正确性)。对于 A),这很简单:

// A') const raw ptr to mutable elements
void foo(int * const arr, unsigned n)
{
arr = nullptr; // illegal, OK!
// ...
}

然而,对于 B),我无法执行此修改。

问题:

  • 是否可以指定衰减为 T * const arr 的“数组类型”函数参数(用于动态数组参数)?

(我很高兴收到一个正确的重复目标来回答这个问题;我自己找不到。据我所知,closest one I found 并没有完全回答上述问题).

最佳答案

不,不可能这样做,这将是无用的语法,而且由于顶级 const 和数组类型实际上都不是函数签名的一部分,因此只会产生误导。

如果您想将参数声明为不可修改的指针,那么就这样做。不要写一些其他的类型,它已经腐烂成不同的东西。

如果您认为有理由这样做,您仍然可以使用数组声明它,然后在定义中添加常量:

// declaration
void foo(int arr[], unsigned n);

// definition
void foo(int * const arr, unsigned n)
{
...
}

关于c++ - 将 `const` CV 限定符应用于衰减数组样式 `T arr[]` 函数参数(旨在衰减到 `T * const arr` ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44354676/

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