【问题标题】:Differrent function signatures C++不同的函数签名 C++
【发布时间】:2020-11-30 12:54:54
【问题描述】:

找到了一些 C++ 测试,其中一个问题是:函数签名之间的差异是什么。 我对以下答案是否正确?

void f(data); // 1)calls copy constructor of data to pass in function
void f(data*); // 2)data passes to function by ptr, no copy constructor called
void f(data const*); // 3)same as 2, but not allowed to change pointer, allowed to change data
void f(data* const); // 4)same as 2, but not allowed to change data, allowed to change pointer
void f(data const* const); // 5) same as 2, niether ptr and data can be changed
void f(data&); // 6) same as 2, but ref instead of ptr
void f(data const&); // 7) same as 3
void f(data&&); // 8) Refence to reference(most subtle moment to me), move constructor, depends on function original data can be erased

【问题讨论】:

  • 3 和 4 是向后的,与 ​​7 相同,您也不能更改那里的数据。 8 是universal reference
  • 而 8 是右值引用,而不是对引用的引用。
  • 7 与 3 不同。3 是指向 const 数据对象或 const 数据对象数组的可变(可能为 nullptr)指针,7 是对 const 数据的引用。
  • 谢谢大家

标签: c++


【解决方案1】:

不完全是:

    1. 不一定要复制。可以使用其他构造函数来初始化参数。
    1. 和 4. 是错误的方式。
    1. 不存在“对引用的引用”之类的东西。那是一个右值引用。将引用绑定到值时不调用构造函数。

【讨论】:

    【解决方案2】:

    作为对 8 的附加声明:正如这里已经提到的,没有像对引用的引用这样的东西(至少不是作为一个普通的基本 C++ 对象/值类型类别)。它的确切引用类型取决于使用上下文,但在大多数情况下,它被称为右值引用。在非评估模板参数上下文中 - f 是函数模板, date 是类型化模板参数 - 它的引用类型称为转发引用。为了严格遵守标准术语,它也不是 Coy Kramer 在这里所说的通用参考,因为出于各种原因,委员会在 2015 年不接受 Scott Meyers 的术语。

    【讨论】:

      猜你喜欢
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      相关资源
      最近更新 更多