`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 = &n
和auto 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?
在您的示例中,n
是 int
,区别在于编码风格。
但是,如果 n
是 struct
或 class
类型的实例,它提供一元 operator&()
,则存在差异。如果重载 operator&
return 任何非指针类型,auto *p = &n
将被诊断为错误。 auto p = &n
仅当 operator&()
return 为 void
时才会被诊断为错误。如果后续代码依赖于 &n
提供指针,这可能很有用(从某种意义上说,编译器最好及早诊断问题)。
无可否认,重载 operator&()
是一种相对罕见(且有风险)的用例,而重载到 return 非指针类型则相当罕见。然而,给出了现实世界的例子 here and here.
#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
有什么区别吗?或者只是编码风格问题?
Any difference between
auto* p = &n
andauto 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
andauto p = &n
? or just a coding style issue?
在您的示例中,n
是 int
,区别在于编码风格。
但是,如果 n
是 struct
或 class
类型的实例,它提供一元 operator&()
,则存在差异。如果重载 operator&
return 任何非指针类型,auto *p = &n
将被诊断为错误。 auto p = &n
仅当 operator&()
return 为 void
时才会被诊断为错误。如果后续代码依赖于 &n
提供指针,这可能很有用(从某种意义上说,编译器最好及早诊断问题)。
无可否认,重载 operator&()
是一种相对罕见(且有风险)的用例,而重载到 return 非指针类型则相当罕见。然而,给出了现实世界的例子 here and here.