タグ付けされた質問 「auto」

`auto`キーワードは、推論された型のためにC ++ 11で再利用されました。初期化された変数宣言で型名を置き換えるために使用すると、変数には初期化子と同じ型が与えられます。戻り値の型として使用する場合、戻り値の型は末尾の戻り値の型として指定されるか、またはreturn-expressionから推定されます。


14
C ++ 11のautoキーワードでは多すぎますか?
私はauto、C ++ 11標準で利用できる新しいキーワードを、それが設計されたと考えている複雑なテンプレート型に対して使用しています。しかし、私はそれを次のものにも使用しています: auto foo = std::make_shared<Foo>(); そしてもっと懐疑的に: auto foo = bla(); // where bla() return a shared_ptr<Foo> 私はこのトピックについてあまり議論していません。と思われるautoタイプは、多くの場合、文書化と健全性チェックの形であることから、過剰に使用することができます。使用の際にどこに線を引くautoか、この新機能の推奨される使用例は何ですか? 明確にするために、私は哲学的な意見を求めているのではありません。標準的な委員会によるこのキーワードの意図された使用をお願いします。おそらく、その意図された使用が実際にどのように実現されるかについてのコメントが必要です。 補足:この質問は、SE.Programmersに移動され、Stack Overflowに戻されました。これに関する議論は、このメタ質問にあります。

4
auto &&は何を教えてくれますか?
あなたがのようなコードを読んだ場合 auto&& var = foo(); ここで、fooタイプの値によって返す任意の関数ですT。次にvar、へのタイプの右辺値参照の左辺値ですT。しかし、これは何を意味するのvarでしょうか?それは私たちのリソースを盗むことを許可されているということですvarか?を使用auto&&してコードの読者に、unique_ptr<>あなたが独占的な所有権を持っていることを伝えるためにa を返すときのようなことを伝えるために使用すべき合理的な状況はありますか?そして、たとえばクラス型のT&&場合Tはどうでしょうか? auto&&テンプレートプログラミング以外のユースケースがあるかどうかを理解したいだけです。この記事の例で説明されているものと同様に、スコット・マイヤーズのユニバーサルリファレンス。

2
decltype(auto)の用途は何ですか?
OverаэтотвопросестьответынаStack Overflowнарусском:Конструкцияdecltype(auto) c ++ 14では、decltype(auto)イディオムが導入されています。 通常、その使用は、auto宣言でdecltype指定された式のルールを使用できるようにすることです。 イディオムの "良い"使用法の例を検索すると、(Scott Meyersによる)次のようなもの、つまり関数の戻り値の型の推定についてしか考えることができません。 template<typename ContainerType, typename IndexType> // C++14 decltype(auto) grab(ContainerType&& container, IndexType&& index) { authenticateUser(); return std::forward<ContainerType>(container)[std::forward<IndexType>(index)]; } この新しい言語機能が役立つ他の例はありますか?

7
C ++ autoキーワード。なぜそれは魔法なのですか?
私がC ++を学ぶために使用したすべての資料から、auto常に何の目的も果たさない奇妙なストレージ期間指定子でした。しかし、つい最近、それ自体を型名として使用するコードに遭遇しました。好奇心から私はそれを試しました、そしてそれは私がそれに偶然割り当てるもののタイプを想定しています! 突然、STLイテレータや、テンプレートを使用するものはすべて、10倍簡単に記述できます。Pythonのような「楽しい」言語を使用しているように感じます。 このキーワードは私の人生のどこにありましたか?それはビジュアルスタジオ専用であるか、ポータブルでないと言って、私の夢を打ち砕いてくれませんか?
144 c++  types  c++11  auto 

14
C ++でautoを使用して変数を宣言することの欠点はありますか?
これはauto、C ++ 11に追加されるかなり重要な機能であり、多くの新しい言語に従っているようです。Pythonのような言語と同様に、明示的な変数宣言はありません(Python標準を使用して可能かどうかはわかりません)。 auto変数を明示的に宣言する代わりにを使用して宣言することに欠点はありますか?

6
C ++ 11で「auto」を使用して推定されるときのラムダのタイプは何ですか?
ラムダの型は関数ポインターであるという認識がありました。以下のテストを行ったところ、間違っていることがわかりました(デモ)。 #define LAMBDA [] (int i) -> long { return 0; } int main () { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok assert(typeid(pFptr) == typeid(pAuto)); // assertion fails ! } 上記のコードにポイントがありませんか?そうでない場合、キーワードでtypeof推定されるときのラムダ式は何autoですか?
141 c++  lambda  c++11  typeof  auto 

4
プライベートタイプでautoを使用できるのはなぜですか?
次のコードがコンパイルされて実行されることになんとなく驚いた(vc2012&gcc4.7.2) class Foo { struct Bar { int i; }; public: Bar Baz() { return Bar(); } }; int main() { Foo f; // Foo::Bar b = f.Baz(); // error auto b = f.Baz(); // ok std::cout << b.i; } このコードが正常にコンパイルされることは正しいですか?そして、なぜそれが正しいのですか?auto名前を(期待どおり)使用できないのに、プライベートタイプで使用できるのはなぜですか?

2
関数の見出しにある矢印演算子(->)
私は次のコードに出くわしました: template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) { return a+b; } 理解できないことが1つあります。 ->関数の見出しで矢印演算子()が何を意味するかはどこで確認できますか?純粋に論理的には、->演算子が型を決定し、それautoが推定されると思いますが、これをまっすぐに取得したいと思います。情報が見つかりません。
128 c++  c++11  auto  decltype 

7
なぜauto a = 1; Cでコンパイルしますか?
コード: int main(void) { auto a=1; return 0; } ファイルに.c拡張子が付いている場合、MS Visual Studio 2012コンパイラによってエラーなしでコンパイルされます。私は、.c拡張子を使用する場合、コンパイルはC ++ではなくC構文に従う必要があると常に考えていました。さらに、私が知る限り、型なしのautoは、C ++ 11以降のC ++でのみ許可されています。これは、型が初期化子から推定されることを意味します。 それは私のコンパイラがCに固執していないことを意味しますか、それともコードは実際にはC言語で正しいのですか?
125 c  auto  c11 

6
ラムダが自分自身を返す:これは合法ですか?
このかなり役に立たないプログラムを考えてみましょう: #include <iostream> int main(int argc, char* argv[]) { int a = 5; auto it = [&](auto self) { return [&](auto b) { std::cout << (a + b) << std::endl; return self(self); }; }; it(it)(4)(6)(42)(77)(999); } 基本的に、自分自身を返すラムダを作成しようとしています。 MSVCはプログラムをコンパイルし、実行します gccはプログラムをコンパイルし、segfaultします clangは次のメッセージでプログラムを拒否します。 error: function 'operator()<(lambda at lam.cpp:6:13)>' with deduced return type cannot …

3
ジェネリックラムダはC ++ 14でどのように機能しますか?
autoC ++ 14標準でジェネリックラムダはどのように機能しますか(引数の型としてのキーワード)? それは、C ++テンプレートに基づいていますか?異なる引数型ごとに、コンパイラーは同じ本体を使用して新しい関数を生成しますが、型を置き換えます(コンパイル時のポリモーフィズム)、それともJavaのジェネリック(型消去)に似ていますか? コード例: auto glambda = [](auto a) { return a; };
114 c++  lambda  auto  c++14 

6
Javaで自動型推論はありますか?
autoC ++のようなJavaの変数型はありますか? 例: for ( auto var : object_array) std::cout << var << std::endl; for( auto var : object_array) var.do_something_that_only_this_particular_obj_can_do(); Javaには強化されたforループがあることは知っていますが、自動はありますか?そうでない場合、これを行うためのハックはありますか?C ++ 11の新機能について言及しています
113 java  c++  auto 

4
末尾の戻り値の型の構文スタイルを新しいC ++ 11プログラムのデフォルトにする必要がありますか?[閉まっている]
クローズ。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 3年前に閉鎖されました。 この質問を改善する C ++ 11は、新しい関数構文をサポートしています。 auto func_name(int x, int y) -> int; 現在、この関数は次のように宣言されます。 int func_name(int x, int y); 新しいスタイルはまだ広く採用されていないようです(gcc stlで言う) ただし、この新しいスタイルは、新しいC ++ 11プログラムのどこでも優先する必要がありますか、それとも必要な場合にのみ使用しますか? 個人的には、可能な限り古いスタイルを好みますが、スタイルが混在するコードベースはかなり醜いように見えます。

7
'auto'キーワードを明示的に記述する必要があるのはなぜですか?
私はC ++ 98からC ++ 11に移行し、autoキーワードに慣れてきました。autoコンパイラが型を自動的に推測できるかどうかを明示的に宣言する必要があるのはなぜだろうと思っていました。C ++は強く型付けされた言語であり、これはルールですが、変数を明示的に宣言せずに同じ結果を達成することはできませんでしたautoか?
80 c++  c++11  auto 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.