Есть ли разница между `auto * p = & n` и` auto p = & n`? - PullRequest
2 голосов
/ 18 апреля 2020
#include <type_traits>

int main()
{
    int n;

    auto* p1 = &n;
    auto  p2 = &n;

    static_assert(std::is_same_v<decltype(p1), decltype(p2)>); // ok
}

Есть ли разница между auto* p = &n и auto p = &n? или просто проблема стиля кодирования?

Ответы [ 3 ]

4 голосов
/ 18 апреля 2020

Есть ли разница между auto* p = &n и auto p = &n? или просто проблема стиля кодирования?

В вашем примере, где n - это int, разница заключается в стиле кодирования.

Однако, если n - это экземпляр типа struct или class, который обеспечивает унарный operator&(), тогда есть разница. auto *p = &n будет диагностироваться как ошибка, если перегруженный operator& возвращает любой тип без указателя. auto p = &n будет диагностироваться как ошибка, только если operator&() вернет void. Это может быть полезно (в том смысле, что компилятору лучше диагностировать проблемы на ранних этапах), если последующий код использует &n, дающий указатель.

По общему признанию, перегрузка operator&() является относительно редкой (и рискованно), и перегрузка для возврата типа без указателя встречается довольно редко. Однако примеры из реальной жизни приведены здесь и здесь .

1 голос
/ 18 апреля 2020

Есть ли разница между auto* p = &n и auto p = &n?

Нет разницы.

или просто проблема стиля кодирования?

Да, для некоторых может быть яснее, если auto* p1 = &n;, что это указатель.

Обратите внимание, однако, базовое руководство cpp , кажется, предпочитает более поздний / более простой стиль auto p2 = &n; возможно, потому что это согласуется с использованием интеллектуального указателя - для начала не требуется *, например:

auto p = make_shared<X>(2);
0 голосов
/ 18 апреля 2020

Нет разницы кроме читабельности. Это потому, что вы берете адрес l-значения с правой стороны. Адреса могут храниться только в указателях, поэтому компилятор сможет выяснить, каким должен быть auto.

Обратите внимание, что было бы иначе, если бы вы взяли ссылку на целое число:

int n;

auto& p1 = n; //reference to integer
auto p2 = n; //copy

и они имеют совершенно разные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...