1. ホーム
  2. c++

[解決済み] C++03で'auto'キーワードを使う理由はあるのでしょうか?

2023-05-20 15:01:42

質問

注意 この質問は、C++11 が承認される前、そして auto キーワードの意味が大幅に変更される前に投稿されたものです。 提供された回答は のみ の C++03 の意味に関するものです。 auto -- の C++11 の意味ではなく、ストレージ クラスが指定されていることを意味します。 auto -- の意味ではなく、自動的な型控除を意味します。 どのような場合に C++11 の auto をいつ使うかについてのアドバイスを探しているなら、この質問はその質問とは関係ありません。

長い間、私は、この質問に対して static キーワードを使う理由はないと思っていました。なぜなら、ブロックスコープの外側で宣言された変数は暗黙のうちにグローバルだからです。その後、私は、変数を static として宣言すると、ブロック スコープ内でその変数に永続性が与えられ、ブロック スコープの外側(プログラム スコープ内)で宣言すると、ファイル スコープ(そのコンパイル ユニット内でのみアクセス可能)が与えられるということを発見しました。

ということで、私が(たぶん)まだ完全に理解していないキーワードがひとつだけ残っています。それは auto キーワードです。このキーワードには「ローカル変数」以外に何か意味があるのでしょうか?あなたがそれを使いたいと思う場所で、暗黙のうちにあなたのために行われていない何か?どのようにして auto 変数はプログラムスコープでどのように振る舞うのでしょうか?また static auto 変数はどうなるのでしょうか?このキーワードは ただ完全性のために存在する ?

どのように解決するのですか?

auto はストレージクラス指定子です。 static , registerextern もあります。宣言ではこの4つのうち1つしか使えません。

ローカル変数( static のない) ローカル変数は自動的に保存され、定義が始まってからブロックの終わりまで保存されます。これは、定義が始まってからそのブロックの終わりまで生き続けることを意味します。

C++でそれを使用する理由を私は知りません。暗黙の int ルールがある古い C バージョンでは、次のように変数を宣言するために使用することができます。

int main(void) { auto i = 1; }

有効な構文にするため、あるいは代入式と曖昧さをなくすために、万が一 i がスコープ内にある場合に、代入式との曖昧さをなくすためです。しかし、これはC++ではとにかくうまくいきません(型を指定する必要があります)。おかしなことに、C++ Standardはこう書いている。

ブロックスコープでストレージクラス指定子なしで宣言されたオブジェクト、または関数パラメータとして宣言されたオブジェクトは、デフォルトで自動ストレージ期間を持つ。[注:したがって、auto指定子はほとんど常に冗長であり、あまり使用されません。autoの1つの使用法は、宣言文と式文(6.8)を明示的に区別することです。- エンドノート]。

のキャストのどちらかであり、次のシナリオを参照します。 a から int または変数の宣言 a 型の int の周りに冗長な括弧がある a . これは常に宣言とみなされます。 auto はここでは何の役にも立ちませんが、人間にとってはそうなります。しかし、もう一度言いますが、人間は a と言うことになります。

int(a);

の新しい意味と auto が C++0x に到着したため、コード内で C++03 の意味と一緒に使用するのはお勧めしません。