W GotW 94, Herb Sutter rozróżnienie pomiędzy "klasycznym C++" deklaracjiC++ 11 rodzaj odliczenie vs const char *
const char* s = "Hello";
i "nowoczesnego" stylu
auto s = "Hello";
mówi nas, że istnieje "subtelna różnica w rodzaju s
, gdzie styl auto
jest bardziej poprawny". [Edytowane w celu dodania: komentarze sugerują, że może to nie być uczciwą reprezentacją tego, co Sutter rzeczywiście miał na myśli; zobacz dyskusję poniżej.]
Ale ... co za różnica? Miałem wrażenie, że const char *
jest prawidłowym sposobem odnoszenia się do literału ciągłego. Ponadto, gdy poprosiłem mojego debugger (lldb), wydaje się myśleć typy są rzeczywiście takie same:
* thread #1: tid = 0x1756c2, 0x0000000100000f8f test`main + 31 at test.cc:4, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100000f8f test`main + 31 at test.cc:4
1 int main(void) {
2 const char* s = "Hello";
3 auto t = "Hello";
-> 4 return 0;
5 }
(lldb) fr v
(const char *) s = 0x0000000100000f91 "Hello"
(const char *) t = 0x0000000100000f91 "Hello"
Gdzie jest subtelna różnica Sutter dotyczy?
To bardzo subtelna różnica, którą mógłbym powiedzieć. –
Nie ma różnicy. Mógłby pomyśleć, że 'auto' zamiast tego wyprowadzi tablicę, ale nie będzie. –
Sutter faktycznie stwierdza "na przykład, czy możesz dostrzec subtelną różnicę w typie s, gdzie styl automatyczny jest bardziej poprawny?" Twoja parafraza nadaje zupełnie inne znaczenie temu stwierdzeniu. –