如何在现代 C++ 中替换默认的 int* 参数并修改它?

问题描述 投票:0回答:1

我正在查看一些 C++ 代码,这些代码当前传递一个可以为 null 的 int* 数组并执行一些逻辑。假设它具有以下形式:

void modifyArray(int* arr = nullptr) {
    if (arr) {
        *arr += 10;
    }
}

我知道这很容易出现内存泄漏,我正在尝试用现代 C++ 概念替换。据我了解,最佳实践是:

  1. 使用
    std::array
    代替
    int*
  2. 通过引用传递以避免复制
  3. 使用
    std::optional
    防止空时使用

我在实施这个概念时遇到了困难。我尝试了类似以下的内容(确切的逻辑并不重要):

void modifyArray(std::optional<std::array<int, 5>>& optArr = std::nullopt) {
    if (optArr) {
        for (auto& element : optArr.value()) {
            element += 10;
        }
    }
}

但它无法编译,因为

std::nullopt
是一个常量 (
Non-const lvalue reference to type 'std::optional<std::array<int, 5>>' cannot bind to a value of unrelated type 'const nullopt_t'
)。 我还没有找到一种方法来同时实现上述所有内容。这可行吗?

c++ c++17
1个回答
0
投票

用我自己的非常量默认数组替换

std::nullopt
解决了我的问题,如下所示:

std::optional<std::array<int, 5>> DEFAULT_ARR;

void modifyArray(std::optional<std::array<int, 5>>& arr= DEFAULT_ARR) {
    if (arr) {
        for (auto& element : arr.value()) {
            element += 10;
        }
    }
}

现在我可以调用两个版本了:

int main() {
    modifyArray();

    std::array<int, 5> arr = {1, 2, 3, 4, 5};
    std::optional<std::array<int, 5>> optionalArr = arr;
    modifyArray(optionalArr);
}

这里仍然有改进的空间,因为在我看来,不必在函数中定义这个额外的常量,并且如果这个函数的用户不必用

std::optional
包装他们的数组(以获得一个使用类似 C 的数组的更接近的经验),但这似乎确实有效 -
modifyArray
的任何实现都允许修改数组的内容,并且它不能访问非法内存。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.