由于auto
关键字是在编译时获取类类型的,所以我想知道使用auto*
时是否完全有效,或者该表达式是否有任何特殊用途,因为{{1 }}在编译时已经获得了指针类型。
答案 0 :(得分:9)
除了非常奇怪的情况下,所有这种“新奇的C ++ 11”都与高效编译无关。 所有这些都使人类可以更轻松地编写和理解代码。 auto*
很明显,您拥有指针类型的值,并且编译器仅将其用作附加的类型检查条件,并且如果该类型不是指针类型,则将发出诊断-然后您的代码格式错误,这是一个硬错误。
如果auto*
能够作为消除歧义的人参加类型推导,我不会立刻想起,但是如果这样做,那将是使用它的技术原因。 语言律师,船上有语言律师吗? :)
大多数设计正确的项目(甚至大型项目)在更改后应迅速重新编译,这是对代码进行适当分区以及拥有可利用这种分区的开发版本的问题。
答案 1 :(得分:8)
auto*
仅在两种情况下才有意义。
1)您想让读者清楚他们正在处理指针变量。
2)如果分配给auto*
变量的实际上不是指针,则您希望编译错误。
在这些情况下,多余的*
是多余的,而简单的auto
也是一样。
所有这些都与效率无关。丝毫不会改变最终的编译代码。
答案 2 :(得分:2)
两者之间没有明显的编译时间差异。
主要区别是语义上的区别:如果您说auto*
,那么如果返回类型不是指针,则编译可能会比使用auto
早,而失败则可能会晚一些(也许甚至晚)作为链接阶段,并带有更钝的错误消息。
答案 3 :(得分:1)
摘自C ++标准的7.1.6.4节[dcl.spec.auto]:
如果占位符是
auto
type-specifier ,则使用模板自变量推导规则确定推导类型。
[示例:
const auto &i = expr;
i
的类型是以下发明函数模板的调用u
中参数f(expr)
的推导类型:template <class U> void f(const U& u);
—结束示例]
因此,如果您使用auto*
而不是auto
,则不会对性能产生明显影响。
要回答另一个问题auto*
是否会与auto
不同,请考虑以下问题:
template<class U>
void foo(U u);
template<class U>
void bar(U* u);
如果bar(expr)
是指针,则只能 调用 expr
。如果expr
是一个指针,则foo(expr)
将有U
是一个指针。因此,auto a = expr
和auto* b = expr
在expr
是指针的每种情况下都是等效的。如果不是指针,b
会使程序格式错误,而a
则会正常编译。
因此,没有,没有区别,只是auto*
强制将赋值作为指针。