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

时间:2020-04-18 12:36:02

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

.
myapp.jar
build.xml
build.properties

#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之间有什么区别?还是只是编码样式问题?

3 个答案:

答案 0 :(得分:4)

auto* p = &nauto p = &n之间有什么区别?还是只是编码样式问题?

在您的示例中,nint,区别在于编码样式。

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

诚然,重载operator&()是一个相对罕见(且有风险)的用例,重载以返回非指针类型的情况非常少见。但是,给出了herehere的真实示例。

答案 1 :(得分:1)

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

没有区别。

还是只是编码样式问题?

是的,对于某些人来说,使用auto* p1 = &n;可以更清楚地知道它是一个指针。

但是请注意,cpp core guideline似乎偏爱后来的/简单的样式auto p2 = &n;,也许是因为它与智能指针的用法一致-不需要任何*开头,例如:

auto p = make_shared<X>(2);

答案 2 :(得分:-2)

除了可读性外没有其他区别。这是因为您要获取右侧的l值的地址。地址只能存储在指针中,因此编译器将能够确定auto应该是什么。

请注意,如果您要引用整数,将会有所不同:

int n;

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

它们具有完全不同的含义。