Подтвердить что ты не робот

Вывод типа С++ 11 vs const char *

В 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"

Где тонкая разница, на которую ссылается Саттер?

4b9b3361

Ответ 1

Вы не совсем поняли, что сказал Херб (контекст важен), но в любом случае типы одинаковы.

Ответ 2

Я разместил это в Herb Sutter:

Как вы думаете, "тонкая разница в типе s, где авто стиль более правильный"? Вывод типа С++ 11 vs const char *

И вот его ответ:

Я думаю, что я имел в виду, что авто версия выводила массив, который он оленья кожа. Если бы у меня было что-то еще, я забыл это сейчас, поэтому Ive удалил эту фразу и добавил ваш прозвище к Выражение признательности. Спасибо за отзыв!