В GotW 94 Herb Sutter проводит различие между декларацией "классический С++"
const char* s = "Hello";
и "современный" стиль
auto s = "Hello";
Он говорит нам, что "тонкая разница в типе s
, где стиль auto
более правильный". [Отредактировано для добавления: комментарии предполагают, что это может быть не справедливое представление о том, что на самом деле означал Саттер; см. обсуждение ниже.]
Но... какая разница? У меня создалось впечатление, что const char *
- это правильный способ ссылаться на строковый литерал. Кроме того, когда я спросил своего отладчика (lldb), кажется, что типы на самом деле одинаковы:
* 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"
Где тонкая разница, на которую ссылается Саттер?