【问题标题】:C++ demo function uses both a const argument that is a pointer why is this?C++ 演示函数同时使用作为指针的 const 参数这是为什么?
【发布时间】:2020-04-04 17:41:25
【问题描述】:

std::filesystem c++17 库文档中,有多个函数的输入实例是 const 并且还使用它的引用。

void demo_exists(const fs::path& p, fs::file_status s = fs::file_status{});

const& 肯定是矛盾的。我的理解是,const 用于您不希望修改变量时使用,& 用于在函数内改变多个参数而不必在之后将它们作为数组返回。

肯定同时使用const& 是矛盾的和令人困惑的,或者是否有理由同时使用它们?

提前致谢

来自文档https://en.cppreference.com/w/cpp/filesystem/exists的原始示例

【问题讨论】:

  • 不,它们并不矛盾。引用还可以使代码更高效,因为不必复制参数。
  • 使用const fs::path& p 声明p 是对常量fs::path 对象的引用。 const 表示您不能修改p,引用表示您不必复制整个对象。这种对常量对象的引用也可以用于绑定到rvalues,这意味着您可以使用字符串而不是实际的path对象来调用这个函数(即demo_exists("/some/path")是有效的)。

标签: c++ function functional-programming c++17


【解决方案1】:

我的理解是,当你不想修改变量时使用 const,而当你想在函数中改变多个参数而不必在之后将它们作为数组返回时使用 &。

这并不完全正确。当您想避免复制时,您通过引用传递。尽管自从引入了移动语义以来,传递 (const) 引用的许多用途都已过时。

当方法不修改参数时,您将引用声明为const,并且只有在必须修改参数时才声明为非常量。

例子:

void foo(const SomeLargeObject&); // pass by reference to avoid copy

void bar(int&);                   // pass non-const reference to modify the parameter

PS:

C++ 演示函数同时使用了作为 指针 的 const 参数,这是为什么?

这里没有一个指针。可能令人困惑的是地址关闭运算符和引用类型的符号是相同的:&。但是,它有两种截然不同的含义:

 int x = 0;
 int* pointer_to_x = &x;    // here it is address-of operator
 int& reference_to_x = x;   // here it declares reference_to_x as reference to int

PS2:为了完整起见,我想再提一件事。 C++ 中的第二个不幸的事情是“引用”通常指的是 C++ 引用(参见上面的示例)。另一方面,术语“通过引用传递”在更广泛的上下文中使用,并且在“某些引用”的含义中使用“引用”,即它可以是引用或者它可以是指针。在更广泛的意义上 (*) 这两个都是传递引用,允许方法修改所引用的内容:

void foo(int& x);   // A
void foo(int* x);   // B

在 C++ 中,应优先使用引用 (A),除非“无值”(即空指针)是有效输入。

(*) 准确地说,指针本身实际上是按值传递的。

【讨论】:

  • 我认为 (B) 是严格的(指针的)值传递。
  • 那么最好始终使用 void 函数并始终传递将返回的值吗?
  • @Tasty213 首先,对不起,但我对“无效函数”这个术语过敏,一个函数不仅仅是它的返回类型。无论如何,一般来说,当你想要返回某些东西时,返回值是“更好的”。考虑x = foo(); vs foo(x); ...在哪个函数上x是函数调用的结果更明显?
猜你喜欢
  • 2013-04-28
  • 2018-09-02
  • 1970-01-01
  • 2020-08-12
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多