C ++ 03の「自動」キーワードを使用する理由はありますか?
質問
C ++ 11が批准してauto
キーワードが大幅に変更されたという意味の前に前に注は、この質問はもともと、2009年に投稿されました。関連するのみの
static
のC ++ 03の意味に提供答え -static auto
のC ++ 11の意味をしていない - - それは、ストレージ・クラスは、指定された自動されていること型推論。あなたがC ++ 11 <=>を使用する際のアドバイスを探しているなら、この質問は、その質問には関係ありません。
私はCで<=>キーワードを使用する理由がなかったと思った最長時間のために、ブロック・スコープの外で宣言された変数は、暗黙的にグローバルであったため。私は(のみがコンパイル単位でアクセスすることができるブロック範囲内<=>として変数を宣言すると、それを永久持続時間を与えるだろう、と(プログラムスコープで)ブロックスコープの外に宣言することは、ファイルスコープを与えることを発見し)。
<=>キーワードを:これは私が(多分)まだ完全には理解していない唯一のキーワードで私を残します。以外のそれにはいくつかの他の意味があるのローカル変数は?」あなたはそれを使用することもできますどこにそれはそれは暗黙のうちに、あなたのために行われていないん何か?どのようにプログラムの範囲内<=>変数振る舞いをしますか?ファイルスコープで<=>変数の何?このキーワードは、のちょうど完全を期すため、既存のの
以外の目的を持っています解決
auto
、static
、ストレージクラス指定子でregister
とextern
すぎます。あなただけの宣言でこれら四つのいずれかを使用することができます。
i
なし)ローカル変数は、彼らがブロックの終わりまで、その定義を開始してから生きる意味自動記憶域期間を、持っています。それはとにかく、デフォルトであるため、彼らの前に自動を置くことは冗長です。
私はC ++でそれを使用する理由を知りません。
:暗黙のint型のルールを持っている古いCのバージョンでは、のように、変数を宣言するためにそれを使用することができますint main(void) { auto i = 1; }
それ有効な構文にするか、ケースの代入式から明確にするためにa
範囲です。しかし、これは(あなたがタイプを指定する必要があります)とにかくC ++では動作しません。十分おかしい、C ++標準は、書き込みます:
の目的は、ブロックスコープでストレージクラス指定なしで宣言または関数パラメータは、デフォルトで自動保存期間を有するように宣言しました。 [注:したがって、自動指定子はほとんど常に冗長でしばしば使用されません。自動車の使用を明示的に表現文(6.8)からの宣言文を区別することです。 - エンドノート]
int
する<=>のキャスト又は<=>周り冗長括弧を有するタイプの可変<=> <=>の宣言のいずれかとすることができる次のシナリオを意味します。常に<=>ではなく、ここに便利なものを追加しますが、人間の場合とないように、宣言であると解釈されます。しかし、その後、再び、人間が<=>周りに冗長な括弧を削除したほうが良いでしょう、私が言うます:
int(a);
C ++ 0xで到着<=>の新しい意味で、私はコード内のC ++ 03の意味でそれを使用して思いとどまらでしょう。
他のヒント
C ++ 11では、auto
は新たな意味を持っています。それはあなたが自動的に変数の型を推論することができます。
なぜ今までに便利ということですか?のは、基本的な例を考えてみましょう。
std::list<int> a;
// fill in a
for (auto it = a.begin(); it != a.end(); ++it) {
// Do stuff here
}
std::list<int>::iterator
型の反復子が作成<=>。
これは読んでいくつかの深刻な複雑なコードがはるかに簡単に作ることができます。
もう一つの例:
int x, y;
auto f = [&]{ x += y; };
f();
f();
があり、<=>は変数にラムダ式を格納するために必要な種類を推定しました。 ウィキペディアは、件名に良いのカバレッジを持っている。に
autoキーワードは、現時点では何の目的を持っていません。あなたはそれだけでローカル変数のデフォルトのストレージ・クラスを修正再表示することを正確に正しい、という本当に有用な代替static
。
これは、C ++ 0xの中ブランドの新しい意味を持っています。それはあなたのいくつかのアイデアを与えることだったどれだけ役に立たない!
GCCは、ネストされた関数のためauto
の特殊な用途を有します
は、<=>でそれを宣言する必要があります。
「自動」おそらく自分自身のために決定するようにコンパイラーに指示します。そのアナログは、おそらくレジスタにそれを維持しようとするようコンパイラーに指示され、「登録」です。現代のコンパイラは、両方を無視するので、あなたはあまりにもする必要があります。
私はそれは、スタックベースのプロセッサのために、変数がスタックに置かれることを、機能に重要であるときに、明示的に文書化するために、このキーワードを使用します。この関数は、前の関数から戻るには、スタックを変更する際に必要な(またはサービス・ルーチンを中断)することができます。 この場合、私は宣言します:
auto unsigned int auiStack[1]; //variable must be on stack
そして、私は変数の外にアクセスします:
#define OFFSET_TO_RETURN_ADDRESS 8 //depends on compiler operation and current automatics
auiStack[OFFSET_TO_RETURN_ADDRESS] = alternate_return_address;
auto
キーワードは、意図を文書化に役立ちますので。
Stroustrup氏によるとは、「Cプログラミング言語」(第4版、カバーC 11)で、「自動車」の使用は、以下の主な理由を有する(セクション2.2.2)(Stroustrup氏の言葉が引用されている)
1)
の定義は、私たちがタイプを作りたい大きな範囲であります 我々のコードの読者にはっきりと見える。
「自動」とその必要な初期化子で、私たちは、一目で変数の型を知ることができます!
2)
私たちは、
(floatではなく、例えば、二重の)変数の範囲や精度について明示的になりたいです
私の意見ではここに収まる場合には、このようなものです。
double square(double d)
{
return d*d;
}
int square(int d)
{
return d*d;
}
auto a1 = square(3);
cout << a1 << endl;
a1 = square(3.3);
cout << a1 << endl;
3)
「自動」を使用して、我々は、冗長性を避け、ロングタイプの名前を書いています。
テンプレート化イテレータからいくつかのロングタイプの名前を想像します:
(セクション6.3.6.1からのコード)
template<class T> void f1(vector<T>& arg) {
for (typename vector<T>::iterator p = arg.begin(); p != arg.end(); p)
*p = 7;
for (auto p = arg.begin(); p != arg.end(); p)
*p = 7;
}
古いコンパイラでは、自動ですべてのローカル変数を宣言するための一つの方法でした。あなたは、autoキーワードまたはそのようないくつかずにターボCのような古いコンパイラでローカル変数を宣言することはできません。
C ++ 0xの中にautoキーワードの新しい意味がMSDNのチャンネル9サイト<のhref = "HTTPで見つけるSTL上で自由に閲覧可能/ダウンロード可能なビデオ講義では、Microsoftのステファン・T. Lavavejによって非常にうまく説明している://ここをここchannel9.msdn.com/shows/Going+Deep/C9-Lectures-Introduction-to-STL-with-Stephan-T-Lavavej/」のrel = "nofollowを" =タイトル "">。
講義は、その全体で見る価値があるが、autoキーワードに関する部分は29分のマーク(約)程度である。
以外の '自動' に他のいくつかの意味が 'ローカル変数は?' の
未C ++ 03インチ
あなたはそれを使用することもできますどこは何でも、それはそれは暗黙のうちにあなたのために行われていないのですか?の
C ++ 03で全く何もない、。
どのように自動変数は、プログラムの範囲で動作しますか?ファイルスコープの静的auto変数の何?の
キーワード関数/メソッド本体の外側に許可されていない。
このキーワードは、単に完全性のため、既存以外の[C ++ 03で]どんな目的を持っていますか?の
驚くべきことに、はい。 C. Cは、このキーワードを持っていたし、それを禁止またはC ++でその意味を再定義する本当の理由はありませんでしたとC ++の設計基準は、下位互換性の高い学位を含みます。そう、目的は、Cとの1つの以下の非互換性でした。
このキーワードは、単に完全性のため、既存以外のC言語でどのような目的を持っていますか?の
私はごく最近1を学んだ:B. Cから古代のプログラムの移植の容易さは、その構文C.のそれに非常に類似していたが、Bは全くタイプがなかったBと呼ばれる言語から進化しました。 Bにおける変数を宣言するための唯一の方法は、そのストレージタイプ(auto
又はextern
)を指定することでした。このように:
自動I;
この構文はまだCで動作し、
と等価ですint型I;
Cにおいて、ストレージクラスデフォルトはint
し、そしてタイプのデフォルトは<=>するため。私はBに由来し、Cに移植されたすべての単一のプログラムは、その時点で<=>変数の文字通りいっぱいだったと思います。
C ++ 03は、もはやCスタイルの暗黙のint型を許可しないが、暗黙のint型とは異なり、それはの構文のいずれかのトラブルを引き起こすことが知られていなかったので、それがno-長い正確に有用な<=>キーワードを保存しましたCます。