auto
C/C++ で明示的に使用されているストレージ クラスを見たことがありますか? もしそうなら、どのような状況で?
6 に答える
現在の C/C++ では、すべての変数が暗黙的に auto であるため、auto は決して役に立ちません。型宣言を完全に置き換えることができる C++0x で便利です。変数に初期代入がある場合、「auto」は、コメントのように、その代入値の型にします。
auto
過去 10 年以上に書かれたコードで使用されているのを見たことがありません。とにかく使用できる場所は暗示されているauto
場所だけなので、使用する理由はありません。それがまだ存在する唯一の理由は後方互換性のためですが、新しいコードでは避けるべきです。
GCCでは、関数本体の任意の場所でネストされた関数を定義できるようにするために、自動でネストされた関数を宣言する必要がある場合があります。http: //gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Nested-Functions.htmlを参照してください。
Alex が説明したように、auto は C++0x で使用され、初期化コードから型が推論される初期化宣言で型を宣言します。
値を返すコードから型が推定される戻り値の型としても使用するという提案がありました。ただし、これにより曖昧さが生じたため、執筆時点では、C++0x のラムダ構文とより一貫性のあるものが検討されています。
C++ 11 で記述された私のコードの例を次に示します。
c_srgb find_in_book(const c_HVC &HVC) {
auto b = munsell.mun_to_rgb_book.find(HVC);
if( b != munsell.mun_to_rgb_book.end()) {
c_srgb f = b->second;
return f;
} else {
c_srgb ret;
ret.r=ret.g=ret.b=0;
return ret;
}
}
私はこれよりもそれを好みます:
c_srgb find_in_book(const c_HVC &HVC) {
std::_Tree_iterator<std::_Tree_val<std::_Tmap_traits<dj::color::c_HVC,dj::color::c_srgb,std::less<dj::color::c_HVC>,std::allocator<std::pair<const dj::color::c_HVC,dj::color::c_srgb>>,false>>> b = munsell.mun_to_rgb_book.find(HVC);
if( b != munsell.mun_to_rgb_book.end()) {
c_srgb f = b->second;
return f;
} else {
c_srgb ret;
ret.r=ret.g=ret.b=0;
return ret;
}
}
いいえ、クラス指定子を省略した場合と見なされます。私が考えることができる唯一の合理的な使用法は、たとえば、同じ名前のグローバル変数をオーバーライドする特定のローカル変数に注意を喚起すること、またはインタビューの質問として使用することです。
コードの保守に追われている貧弱なプログラマーを混乱させる可能性があります。