C ++:タイプ指定子の前と後のconst参照


144

の引数の違いは何ですか:

int foo1(const Fred &arg) {
...
}

そして

int foo2(Fred const &arg) {
...
}

?このケースは、パラシフトFAQに記載されていません。



2
これはスタイルについての質問ですか?「const Fred」は英語でいいように聞こえますが、「Fred const」は私にはよく見えます。
LatinSuD 2010

1
関連ノートで、1が好むべきで何らかの理由があるFred const &arg以上はFred const& argconst&「constref」を意味するユニットであり、名前argがすべてのタイプ指定子から空白で区切られているため、後者の方が好きです。
フランク

4
@dehmann:しかしint const& ref、「const ref」ではなく「ref to const」を意味するのではありません。
セドリックH.

回答:


112

違いない CONSTが&に対して右から左に読まれるように、両不変フレッド・インスタンスへの参照を表します。

Fred& const参照自体は不変であり、冗長です。扱うときのconstポインタの両方 Fred const*Fred* const有効ですが、異なっています。

スタイルの問題ですがconstconstメンバー関数を含めて一貫して適用できるため、サフィックスとして使用することをお勧めします


次に作るためのポイント何であるstd::is_const<const T&>::valueことはfalse
abyss.7

@ abyss.7はへの参照const Tです。参照は変更可能です。
ショーンファセット

125

動作

間には意味的な違いがあるconst T&とはT const&。言語はそれらを同じ型として扱います。(同じことをに適用const T*してT const*。)

スタイルの問題として

ただし、スタイルに関してどちらを優先するかについては、他の多くの回答に反対し、優先しますconst T&(およびconst T*)。

  • const T&StroustrupのC ++プログラミング言語の本で使用されているスタイルです。
  • const T& C ++標準自体で使用されるスタイルです。
  • const T*K&RのCプログラミング言語の本で使用されているスタイルです。
  • const T* C標準で使用されるスタイルです。
  • 上記の要因により、私はconst T&/ const T*よりも慣性がT const&/ 多いと思いますT const*const T&/ const T*経験的に、私が見たすべてのC ++およびCコードよりもT const&/のほうが一般的ですT const*。一般的な慣習に従うことは、右から左への構文解析規則を独断的に守るよりも読みやすいと思います。
  • を使用T const*すると、*as を誤解しやすくなりますT* const(特に、人々がそれに慣れていない場合)。対照的に、const* Tは正しい構文ではありません。

右から左への解析ルールはどうですか?

人々が使用するのが好きなように思われる右から左への構文解析の引数全体について:別の回答へのコメントで述べたように、const T&右から左へ読むことも読みます。これはT定数への参照です。「T」と「定数」はそれぞれ形容詞または名詞として機能します。(さらに、T const*右から左への読み取りは、「定数T へのポインター」ではなく「T へのポインター定数」として誤って解釈される可能性があるため、あいまいになる可能性があります。)


3
+1、同意。コードを読み取るときに、行がconstで始まる場合は、constを見つけやすくなります。左右規則は、特に毛深い型宣言を手動で解析する場合にのみ必要です。最も一般的なケースに最適化しないのはなぜですか?その上、私があなたが頭の中でFSMを手動で実行する必要があるのであなたがそれを間違っているのでタイプ宣言を書くならば、私見。
Andreas Magnusson 2010年

2
-1。あなたの結論がどれほど正当であり、私がそれらに個人的にどの程度同意するかに関係なく、彼らは質問に直接答えていません。これにより、単純な質問に対する2番目の回答が、結論がなく、直接的な回答もなく、何もない、いくつかの乱雑な水中機械についてのトピック外の意味不明なもののように見えます。「いいえ、両方の構文に意味上の違いはありませんが、次のようなスタイル上の考慮事項があります...」という簡単な明確な要約を追加すると、私の賛成票が得られます。そして、それからはじめてそれらすべての弾丸。
ulidtko 2013

1
IMOのconst T&方が読みやすい理由は次のとおりです。1-コードを左から右に読み取ります。そして、2-新しい概念を説明するとき、私たちはより一般的な概念からより具体的なものに始まります。ここで、constキーワードは変数スペースを2つのカテゴリーに区分するのでより一般的ですが、タイプ指定子はそれを多くに区分します。
pooya13

「へのポインタ」は一緒にとどまる必要があります。したがって、あいまいさはありませんT const*
デクスター

13

それらは1つと同じですが、CおよびC ++宣言の解析に関するRIGHT-LEFTルールとの一貫性を維持するには、次のように書くことをお勧めしますFred const &arg

宣言、修飾子、宣言子についてさらに理解を深めるためにも、これを参照してください。


1
それはtypedef拡張とうまく機能するので、私はサフィックスを好みます。例:typedef int* pointer;、でconst pointer はない const int*int* constです。接尾辞の形式は扱いにくいものではありません。
Matthieu M.10年

4
IMOもconst T&右から左に読みます。これはT定数への参照です。 Tそして、constantそれぞれが形容詞または名詞として働くことができます。
jamesdlin

7

どちらも動作しますが、これはそれを書いた人からの説明です。
彼を引用するには:

どうして?"const"(最初は "readonly"と呼ばれ、対応する "writeonly"があった)を発明したとき、あいまいさなしに実行できるため、型の前または後に配置できるようにしました。




3

参照はポインターと同じようには機能しません。ポインターの場合、 'constポインター'(type * const p)および 'pointer to const'(const type * pまたはtype const * p)を使用できます。

しかし、これは参照には必要ありません。参照は常に同じオブジェクトを参照します。その意味で、「参照」は「const参照」であると考えることができます(「constポインター」を持つことができるのと同じ方法)。

したがって、「type&const ref」のようなものは合法ではありません。「型への参照」(type &ref)と「定数型への参照」(const type &refまたはtype const &ref ;どちらも完全に同等です)。

最後にもう1つ:const type英語でより正確に聞こえても、書くtype constことで「右から左」の宣言をより体系的に理解するint const & refことができます。または、より複雑な例:int const * const & refrefは、定数intへの定数ポインターへの参照です。

結論:あなたの質問では、どちらもまったく同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.