`auto* p = &n` 和 `auto p = &n` 有什么区别?

Any difference between `auto* p = &n` and `auto p = &n`?

#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 = &nauto p = &n有什么区别吗?或者只是编码风格问题?

Any difference between auto* p = &n and auto p = &n?

没有区别。

or just a coding style issue?

是的,对于某些人来说 auto* p1 = &n; 可能更清楚它是一个指针。

但是请注意,cpp core guideline 似乎更喜欢 later/simpler 样式 auto p2 = &n; 可能是因为它与智能指针的用法一致 - 不需要任何 * 开头,例如:

auto p = make_shared<X>(2);

Any difference between auto* p = &n and auto p = &n? or just a coding style issue?

在您的示例中,nint,区别在于编码风格。

但是,如果 nstructclass 类型的实例,它提供一元 operator&(),则存在差异。如果重载 operator& return 任何非指针类型,auto *p = &n 将被诊断为错误。 auto p = &n 仅当 operator&() return 为 void 时才会被诊断为错误。如果后续代码依赖于 &n 提供指针,这可能很有用(从某种意义上说,编译器最好及早诊断问题)。

无可否认,重载 operator&() 是一种相对罕见(且有风险)的用例,而重载到 return 非指针类型则相当罕见。然而,给出了现实世界的例子 here and here.