【问题标题】:Why is this pointer treated as an rvalue in this scenario?为什么在这种情况下将此指针视为右值?
【发布时间】:2020-02-05 18:08:39
【问题描述】:

以下将不起作用:

std::array<int, 3> arr = {1, 2, 3};
int **ptr = &(arr.data());

因为我会尝试获取右值的 addr。我已经解决了:

std::array<int, 3> arr = {1, 2, 3};
int *ptr = arr.data();
int **ptr2 = &ptr;

这似乎工作得很好。

我知道您不能获取右值的地址,但是为什么在这里如此对待它?是因为将从arr.data() 创建一个临时地址,然后分配给ptr,而我会尝试获取该临时地址的地址吗?

【问题讨论】:

  • 你为什么首先想要这个?这个int *ptr = arr.data(); int **ptr2 = &amp;ptr; 对我来说似乎很奇怪。
  • 我很困惑。 “为什么这个指针被视为右值?” “因为它是一个右值。” “为什么这会奏效?” “因为在其中,指针不是右值。”你真的在问“什么是右值,它们与指针有什么关系?”

标签: c++ c++14 rvalue


【解决方案1】:

是因为将从arr.data() 创建一个临时地址,然后分配给ptr,而我会尝试获取该临时地址的地址吗?

是的。任何按值返回的东西都会返回一个右值。 std::array::data返回T*,而不是T*&amp;,所以它的返回值是一个右值。

【讨论】:

    【解决方案2】:

    为什么在这种情况下这个指针被视为右值?

    &(arr.data())
    

    因为std::array::data 返回一个值。调用的结果是prvalue。右值是(“纯”)右值。

    【讨论】:

      猜你喜欢
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2019-02-15
      相关资源
      最近更新 更多