web-dev-qa-db-ja.com

C ++:const参照、型指定子の前後

以下の引数の違いは何ですか?

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

そして

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

?このケースはparashift FAQでカバーされていません。

127
eisbaw

差異なし constは&に関して右から左に読み取られるため、どちらも不変のFredインスタンスへの参照を表します。

Fred& constは、参照自体が不変であることを意味します。つまり、 redundant ; const pointers both Fred const*およびFred* constは有効ですが、異なります。

スタイルの問題ですが、 定数メンバー関数 を含めて一貫して適用できるため、constを接尾辞として使用することを好みます。

103
Sean Fausett

動作

const T&T const&の間に意味的な違いはありません。言語はそれらを同じタイプとして扱います。 (const T*T const*にも同じことが当てはまります。)

スタイルの問題として

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

  • const T&は、StroustrupのThe C++ Programming Language本で使用されているスタイルです。
  • 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*を使用すると、*T* constと誤配置しやすくなります(特に、人々が慣れていない場合)。対照的に、const* Tは正当な構文ではありません。

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

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

115
jamesdlin

CとC++宣言の解析に関する RIGHT-LEFT ルールとの一貫性を保つために、これらはまったく同じですが、Fred const &arg

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

13
Chubsdad

両方とも機能し、 ここ はそれを書いた人からの説明です。
彼を引用するには:

どうして? 「const」(当初は「readonly」という名前で、対応する「writeonly」がありました)を発明したとき、あいまいさなくできるため、タイプの前後に移動できるようにしました。

7
Default
5
Prasoon Saurav
3
Nirocfz

参照は、ポインターと同じようには機能しません。ポインターの場合、 'const pointers'(type * const p)および 'constへのポインター'(const type * p または type const * p)。

ただし、参照にはこれはありません。参照は常に同じオブジェクトを参照します。その意味で、「参照」は「定数参照」であると考えることができます(「定数ポインター」を使用できるのと同じ方法)。

したがって、「type&const ref」のようなものは無効です。 「タイプへの参照」(type &ref)および '定数型への参照'(const type &ref または type const &ref;両方ともまったく同等です)。

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

結論:あなたの質問では、両方ともまったく同じです。

2
Cedric H.