【问题标题】:Any difference between `auto* p = &n` and `auto p = &n`?`auto* p = &n` 和 `auto p = &n` 之间有什么区别?
【发布时间】:2020-07-31 23:47:01
【问题描述】:
#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 = &amp;nauto p = &amp;n 之间有什么区别?还是只是编码风格问题?

【问题讨论】:

  • 风格,可读性。

标签: c++ c++11 syntax coding-style auto


【解决方案1】:

auto* p = &amp;nauto p = &amp;n 之间有什么区别?

没有区别。

还是只是编码风格问题?

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

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

auto p = make_shared<X>(2);

【讨论】:

  • 如果nint 确实没有区别,但总的来说还是有区别的。见@peter。
【解决方案2】:

auto* p = &amp;nauto p = &amp;n 之间有什么区别吗?还是只是编码风格问题?

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

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

诚然,重载operator&amp;() 是一种相对少见(且有风险)的用例,而重载返回非指针类型非常少见。但是,herehere 给出了真实世界的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2021-11-18
    • 2017-03-28
    相关资源
    最近更新 更多