.
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
之间有什么区别?还是只是编码样式问题?
答案 0 :(得分:4)
auto* p = &n
和auto p = &n
之间有什么区别?还是只是编码样式问题?
在您的示例中,n
是int
,区别在于编码样式。
但是,如果n
是struct
或class
类型的实例,它提供一元operator&()
,则存在区别。如果重载的auto *p = &n
返回任何非指针类型,则会将operator&
诊断为错误。仅当auto p = &n
返回operator&()
时,void
才会被诊断为错误。如果后续代码依赖&n
给出指针,则这很有用(从某种意义上说,编译器可以更早诊断问题)。
诚然,重载operator&()
是一个相对罕见(且有风险)的用例,重载以返回非指针类型的情况非常少见。但是,给出了here和here的真实示例。
答案 1 :(得分:1)
auto* p = &n
和auto 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
它们具有完全不同的含义。