11

GotW 94で、Herb Sutter は「クラシック C++」宣言を区別しています。

const char* s = "Hello";

そして「モダン」スタイル

auto s = "Hello";

s彼は、 「autoスタイルがより正確なのタイプには微妙な違いがある」と語っています。[追加編集: コメントは、これが Sutter が実際に意味したことを公正に表現していない可能性があることを示唆しています。以下の説明を参照してください。]

しかし...違いは何ですか?const char *a が文字列リテラルを参照する正しい方法であるという印象を受けました。さらに、デバッガー (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"

Sutter が言及している微妙な違いはどこにあるのでしょうか?

4

2 に答える 2

9

これをHerb Sutterに投稿しました。

「オートスタイルの方が正しい、sの微妙なタイプの違い」って何だと思いますか?C++11 の型推論と const char *を参照してください

そして、これが彼の返事です:

自動バージョンでは配列が推測されていることを念頭に置いていたと思いますが、そうではありません。何か他のことを考えていたのなら、今は忘れてしまったので、そのフレーズを削除し、謝辞にあなたのニックネームを追加しました。フィードバックをお寄せいただきありがとうございます!

于 2014-12-31T00:21:50.883 に答える
8

Herb が何を述べているかは完全にはわかりませんが (コンテキストが重要です)、とにかく型は同じです。

于 2014-12-18T16:06:29.713 に答える