[解決済み] C++03で'auto'キーワードを使う理由はあるのでしょうか?
質問
注意 この質問は、C++11 が承認される前、そして
auto
キーワードの意味が大幅に変更される前に投稿されたものです。 提供された回答は のみ の C++03 の意味に関するものです。auto
-- の C++11 の意味ではなく、ストレージ クラスが指定されていることを意味します。auto
-- の意味ではなく、自動的な型控除を意味します。 どのような場合に C++11 のauto
をいつ使うかについてのアドバイスを探しているなら、この質問はその質問とは関係ありません。
長い間、私は、この質問に対して
static
キーワードを使う理由はないと思っていました。なぜなら、ブロックスコープの外側で宣言された変数は暗黙のうちにグローバルだからです。その後、私は、変数を
static
として宣言すると、ブロック スコープ内でその変数に永続性が与えられ、ブロック スコープの外側(プログラム スコープ内)で宣言すると、ファイル スコープ(そのコンパイル ユニット内でのみアクセス可能)が与えられるということを発見しました。
ということで、私が(たぶん)まだ完全に理解していないキーワードがひとつだけ残っています。それは
auto
キーワードです。このキーワードには「ローカル変数」以外に何か意味があるのでしょうか?あなたがそれを使いたいと思う場所で、暗黙のうちにあなたのために行われていない何か?どのようにして
auto
変数はプログラムスコープでどのように振る舞うのでしょうか?また
static auto
変数はどうなるのでしょうか?このキーワードは
ただ完全性のために存在する
?
どのように解決するのですか?
auto
はストレージクラス指定子です。
static
,
register
と
extern
もあります。宣言ではこの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 の意味と一緒に使用するのはお勧めしません。
関連
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] volatileキーワードは何に役立つのでしょうか?
-
[解決済み] mutable' キーワードには、const 関数で変数を変更できるようにする以外の目的があるのでしょうか?
-
[解決済み] Java の native キーワードは何のためにあるのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】C++でnewキーワードはいつ使うべきですか?
-
[解決済み】C++におけるstaticキーワードとその様々な使用法
-
[解決済み] staticキーワードの非推奨...もういらない?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] C autoというキーワードはどこで使われているのですか?