“auto const” 和 “const auto” 是一样的吗?

104

auto constconst auto有语义上的区别吗?还是它们的意思相同?


12
和其他类型一样,它是相同的。 - chris
我可以提供一个更准确但法律化的答案。由于您没有标记语言律师,我暂时假设您不需要那么详细的信息。 - Arne Vogel
@ArneVogel,现在是你的机会了 :) - Igor Skochinsky
2个回答

137

const限定符作用于其左侧的类型,除非左侧没有任何内容,此时它将作用于其右侧的类型。所以是的,它们是一样的。


4
如果没有任何东西剩下,那么它就是正确的(反之亦然) :-) - Seshadri R
11
这并不是实际情况,特定限定符(在 声明符 之前)的顺序可以任意排列,例如 long volatile unsigned const typedef long cvull;。类型既不是完全在 const 左侧,也不是完全在右侧。 - Arne Vogel
1
@ArneVogel 哎呀,为什么允许在中间使用 typedef :) - 4LegsDrivenCat
1
正如@ArneVogel所评论的那样,这个答案并不完全正确。这个被接受的答案是具有误导性的(可能还很危险)。 - WillY
@ArneVogel,请问我在哪里可以阅读更多关于这个的内容? - Krapnix
结论(它们是相同的)是正确的,但逻辑不太正确,因为auto可以由多个部分组成,例如int *。将auto视为一个大块并加上括号会有所帮助,比如(int *),而不仅仅是int * - undefined

30

刻意的例子:

std::vector<char*> test;
const auto a = test[0];
*a = 'c';
a = 0; // does not compile
auto const b = test[1];
*b = 'c';
b = 0; // does not compile

变量 ab 的类型都是 char* const。不要认为可以简单地用类型名代替关键字 auto(这里是 const char* a)!const 关键字将应用于 auto 匹配的整个类型(这里是 char*)。


const并不真正适用于char*,它适用于char部分,而不是*部分。 - jbruni
@jbruni:但这里的例子似乎表明相反的情况:结尾的char并不是const,这就是为什么你可以替换它。指针本身是const(例如,“*”部分),这就是为什么你无法替换它。 - undefined
@Sz. 是正确的。jbruni的评论正好相反。还有一个小小的提示 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接