简而言之:
Per C ++ Primer,pg 69," auto": "如果我们希望推导出的类型具有顶级 const ,我们必须明确说明"。
我会得到一个顶级const指针:
int i = 42;
const auto *p = &i;
但结果p的类型为const int *
,而不是预期的int * const
。我甚至可以重新分配p = 0;
。为什么?
(注意:使用auto *
的指针类型推导格式来自本书。)
答案 0 :(得分:13)
在您的示例中,p
是指向const int
的指针,而不是指向const
的{{1}}指针。后者可以通过以下声明来实现:
int
答案 1 :(得分:7)
使用auto
,您甚至不需要星号,这样可以轻松实现:
const auto p = &i;
在此处,auto
将类型推断为int *
,使其成为int * const
。请注意,const auto
或auto 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*
。如果您希望p
为int * const
,则正确的表达式为auto * const p = &i
。