【问题标题】:Is there any realistic use case for passing pointers by constant reference rather than by value?有没有通过常量引用而不是值传递指针的实际用例?
【发布时间】:2022-07-14 22:19:03
【问题描述】:

由于引用 (<i>some-type</i>&amp;) 表现为常量指针 (<i>some-type</i> * const),因此通过“对指针的常量引用”参数 (<i>some-type</i> * const&amp;) 传递参数似乎有点多余,因为

  • 如果参数是<i>some-type</i> *
    • 我正在复制它,
    • 我无法编辑原件,因为我只是不处理它;
  • 如果参数是<i>some-type</i> * const&amp;
    • 我没有抄袭,
    • 我无法编辑原件,因为我将其作为const 实体保存。

所以在某种程度上两者之间的唯一区别是前者会产生副本,而后者不会。

反过来,这意味着这种差异对于std::shared_ptrs 可能相对重要,它可能比原始指针和std::unique_ptrs 更大。

但是(如果它们“重”,则通过 const&amp; 传递 std::shared_ptrs)是通过 const&amp; 传递指针参数的唯一用例吗?

【问题讨论】:

  • 一个引用不一定在底层实现为一个常量指针。一些编译器可能将其用作实现细节,但相同的编译器也可能使用不依赖于该方法的其他机制。
  • 指针和智能指针是不同的东西。你问的是哪个?
  • 第一句话真的很触发
  • 不限于指针,您的问题也可能适用于intconst int&amp;
  • TLDR 没有引用不是指针。实际上,您应该首先查看 STL 数据类型(容器),然后查看非原始指针,例如 std::unique_ptr(用于手动分配的内存或多态用例)。仅当您非常确定(可选或多态对象)的生命周期时才使用原始指针。也许您应该阅读:isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines 并查找任何指针。

标签: c++ pointers reference raw-pointer pass-by-const-reference


【解决方案1】:

你不能基于参数的常量来重载函数:

void foo(int* const) {}
void foo(int*) {}            // error : redefinition of foo

但是您可以使用 const/non-const 引用来做到这一点:

void bar(int*&) { std::cout << "non-const\n";}
void bar(int* const&) { std::cout << "cosnt\n";}

int main() {
    int* y = nullptr;
    int* const x = nullptr;
    bar(y);
    bar(x);
}

【讨论】:

    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多