Почему этот указатель рассматривается как значение в этом сценарии? - PullRequest
1 голос
/ 05 февраля 2020

Следующее не будет работать:

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

, потому что я пытаюсь получить адрес rvalue. Я обошел это с помощью:

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

, который, кажется, работает просто отлично.

Я понимаю, что вы не можете взять адрес r-значения, но почему это рассматривается здесь? Это потому, что временное хранилище будет создано из arr.data(), а затем присвоено ptr, и я попытаюсь взять адрес этого временного?

Ответы [ 2 ]

5 голосов
/ 05 февраля 2020

Это потому, что временное хранилище будет создано из arr.data(), а затем присвоено ptr, и я попытаюсь взять адрес этого временного?

Да. Все, что возвращается по значению, возвращает значение. std::array::data return T*, а не T*&, поэтому возвращаемое значение является rvalue.

3 голосов
/ 05 февраля 2020

Почему этот указатель рассматривается в качестве сценария как значение в этом сценарии?

&(arr.data())

Поскольку std::array::data возвращает значение. Результат вызова является предварительным значением. Prvalues ​​- это («чистые») значения.

...