如何使用“auto”获取顶级const指针?

时间:2014-07-05 22:20:44

标签: c++ c++11

简而言之:

Per C ++ Primer,pg 69," auto": "如果我们希望推导出的类型具有顶级 const ,我们必须明确说明"。

我会得到一个顶级const指针:

int i = 42;
const auto *p = &i;

但结果p的类型为const int *,而不是预期的int * const。我甚至可以重新分配p = 0;。为什么? (注意:使用auto *的指针类型推导格式来自本书。)

4 个答案:

答案 0 :(得分:13)

在您的示例中,p是指向const int的指针,而不是指向const的{​​{1}}指针。后者可以通过以下声明来实现:

int

答案 1 :(得分:7)

使用auto,您甚至不需要星号,这样可以轻松实现:

const auto p = &i;

在此处,auto将类型推断为int *,使其成为int * const。请注意,const autoauto const是否与typedef名称无关。

在您的示例中,只有int符合推导类型,使p成为const int *。这不是顶级const,而是指向const int

的指针

查看工作here

答案 2 :(得分:2)

考虑您的原始代码,

int i = 42;
const auto *p = &i;

添加

cout << typeid(p).name() << endl;

报告

int const *

使用Visual C ++。

这与你的陈述相矛盾

  

结果p的类型为int *


这是一种完全控制的方法:

int i = 42;
auto const *const p = &i;

如果你想要一个指向可变对象的const指针,请删除第一个const


或者,正如chris在他的回答中所指出的,如果你想要一个指向可变对象的const指针,你可以做到

auto const p = &i;

答案 3 :(得分:1)

通过auto的类型推导与功能模板完全相同。因此,当您撰写const auto *p = &i;时,p的类型恰好是调用以下模板时p的类型,与f(&i)匹配。

template<typename U>
void f(const U* p);

因此,类型为const int*。如果您希望pint * const,则正确的表达式为auto * const p = &i