タグ付けされた質問 「c++11」

このタグは、C ++ 11としてコンパイルする必要があるコードに使用します(C ++ 14以降で導入された機能は使用しません)。

7
C ++ 11で列挙型クラスの値を出力するにはどうすればよいですか
enum classC ++ 11での値を出力するにはどうすればよいですか?C ++ 03では次のようになります。 #include <iostream> using namespace std; enum A { a = 1, b = 69, c= 666 }; int main () { A a = A::c; cout << a << endl; } c ++ 0xでは、このコードはコンパイルされません #include <iostream> using namespace std; enum class A { a …

3
C ++ 11でstd :: functionが空かどうかを適切に確認する方法
std::functionが空かどうかを適切に確認する方法を知りたいと思っていました。この例を考えてみましょう: class Test { std::function<void(int a)> eventFunc; void registerEvent(std::function<void(int a)> e) { eventFunc = e; } void doSomething() { ... eventFunc(42); } }; このコードはMSVCで正常にコンパイルされdoSomething()ますがeventFunc、コードを初期化せずに呼び出した場合、コードは明らかにクラッシュします。それは予想されますが、私は何の価値があるのeventFuncかと思っていました。デバッガは言う'empty'。だから私は単純なifステートメントを使用してそれを修正しました void doSomething() { ... if (eventFunc) { eventFunc(42); } } これは機能しますが、未初期化の値は何std::functionですか?私が書きたいと思いif (eventFunc != nullptr)ますがstd::function(明らかに)ポインタではありません。 なぜ純粋なものが機能するのですか?その背後にある魔法は何ですか?そして、それをチェックする方法は正しいですか?

6
std :: initializer_listが組み込み言語ではないのはなぜですか?
std::initializer_listコア言語が組み込まれていないのはなぜですか? これはC ++ 11の非常に重要な機能であり、独自の予約済みキーワード(または同様のもの)がないように思えます。 代わりに、initializer_listそれはだだけで、特別な、暗黙の持っている標準ライブラリのテンプレートクラスのマッピング新しいからブレース-のinit-リスト {...}コンパイラによって処理の構文を。 最初は、このソリューションはかなりハックです。 これは、C ++言語への新しい追加が実装される方法ですか?コア言語ではなく、いくつかのテンプレートクラスの暗黙のロールによって? これらの例を検討してください: widget<int> w = {1,2,3}; //this is how we want to use a class 新しいクラスが選ばれた理由: widget( std::initializer_list<T> init ) これらのアイデアのいずれかに類似したものを使用する代わりに: widget( T[] init, int length ) // (1) widget( T... init ) // (2) widget( std::vector<T> init ) // (3) 古典的な配列、おそらくconstあちこちに追加できます …

5
移動のみのタイプのベクターをリスト初期化できますか?
GCC 4.7スナップショットを介して次のコードを渡すと、unique_ptrsをベクターにコピーしようとします。 #include <vector> #include <memory> int main() { using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() }; } std::unique_ptrはコピーできないため、明らかに機能しません。 エラー:削除された関数の使用 'std :: unique_ptr <_Tp、_Dp> :: unique_ptr(const std :: unique_ptr <_Tp、_Dp>&)[with _Tp = int; _Dp = std :: default_delete; std :: unique_ptr <_Tp、_Dp> = std :: unique_ptr] ' …

4
shared_ptr <Derived>をshared_ptr <Base>として渡す
shared_ptr派生型shared_ptrのaを基本型のaを取る関数に渡すための最良の方法は何ですか? shared_ptr不必要なコピーを避けるために、私は通常、参照によってsを渡します。 int foo(const shared_ptr&lt;bar&gt;&amp; ptr); しかし、私が次のようなことをしようとすると、これは機能しません int foo(const shared_ptr&lt;Base&gt;&amp; ptr); ... shared_ptr&lt;Derived&gt; bar = make_shared&lt;Derived&gt;(); foo(bar); 使用できます foo(dynamic_pointer_cast&lt;Base, Derived&gt;(bar)); しかし、これは2つの理由で最適ではないようです。 Aはdynamic_cast、単純なため、過剰なビットが得ツーベースキャストようです。 私が理解しているdynamic_pointer_castように、関数に渡すポインターのコピー(一時的なものではありますが)を作成します。 より良い解決策はありますか? 後世のための更新: ヘッダーファイルがないという問題であることが判明しました。また、ここで私がやろうとしていたことは、アンチパターンと見なされます。一般的に、 オブジェクトの存続期間に影響を与えない(つまり、オブジェクトが関数の期間中有効である)関数は、単純な参照またはポインターを使用する必要がありますint foo(bar&amp; b)。 オブジェクトを消費する関数(つまり、特定のオブジェクトの最終ユーザー)は、unique_ptrby値を取る必要がありますint foo(unique_ptr&lt;bar&gt; b)。呼び出し元はstd::move、関数に値を入力する必要があります。 オブジェクトの存続期間を延長する関数はshared_ptr、値をとる必要がありますint foo(shared_ptr&lt;bar&gt; b)。循環参照を避けるための通常のアドバイスが適用されます。 詳細については、ハーブサッターの「基本に立ち返る」の話を参照してください。

3
Constexprとマクロ
マクロの使用をどこで好むべきで、constexprをどこで好むべきですか?基本的に同じではないですか? #define MAX_HEIGHT 720 vs constexpr unsigned int max_height = 720;
95 c++  c++11  macros  constexpr 

2
「C ++プログラミング言語」第4版のセクション36.3.6のこのコードには、明確に定義された動作がありますか?
Bjarne StroustrupのC ++プログラミング言語の第4版セクションの36.3.6 STLに似た操作では、次のコードがチェーンの例として使用されています。 void f2() { std::string s = "but I have heard it works even if you don't believe in it" ; s.replace(0, 4, "" ).replace( s.find( "even" ), 4, "only" ) .replace( s.find( " don't" ), 6, "" ); assert( s == "I have heard it works …

7
Visual Studio 2012のC ++ 11機能
Visual Studio 2012のプレビューバージョン(VS2010以降の次のバージョン)が利用可能になりました。 それがサポートする新しいC ++ 11機能を誰かが知っていますか?(私は現時点でそれを試すことができません)。

3
ブレースで囲まれたイニシャライザをいつ使用するのですか?
C ++ 11では、クラスを初期化するための新しい構文を使用して、変数を初期化する方法を数多く提供しています。 { // Example 1 int b(1); int a{1}; int c = 1; int d = {1}; } { // Example 2 std::complex&lt;double&gt; b(3,4); std::complex&lt;double&gt; a{3,4}; std::complex&lt;double&gt; c = {3,4}; auto d = std::complex&lt;double&gt;(3,4); auto e = std::complex&lt;double&gt;{3,4}; } { // Example 3 std::string a(3,'x'); std::string b{3,'x'}; // …

6
コンパイル時のC文字列の長さの計算。これは本当にconstexprですか?
コンパイル時に文字列リテラルの長さを計算しようとしています。これを行うには、次のコードを使用しています。 #include &lt;cstdio&gt; int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); } すべてが期待どおりに機能し、プログラムは4と8を出力します。clangによって生成されたアセンブリコードは、結果がコンパイル時に計算されることを示しています。 0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d" 0x100000f65: movl $0x4, %esi 0x100000f6a: movl $0x8, %edx 0x100000f6f: xorl %eax, %eax 0x100000f71: callq …

6
アクティブな例外なしで呼び出されたC ++終了
スレッドでC ++エラーが発生します: terminate called without an active exception Aborted コードは次のとおりです。 #include &lt;queue&gt; #include &lt;thread&gt; #include &lt;mutex&gt; #include &lt;condition_variable&gt; template&lt;typename TYPE&gt; class blocking_stream { public: blocking_stream(size_t max_buffer_size_) : max_buffer_size(max_buffer_size_) { } //PUSH data into the buffer blocking_stream &amp;operator&lt;&lt;(TYPE &amp;other) { std::unique_lock&lt;std::mutex&gt; mtx_lock(mtx); while(buffer.size()&gt;=max_buffer_size) stop_if_full.wait(mtx_lock); buffer.push(std::move(other)); mtx_lock.unlock(); stop_if_empty.notify_one(); return *this; } //POP …

15
C ++ 11にはC#スタイルのプロパティがありますか?
C#には、ゲッターとセッターを持つフィールド用の素晴らしい構文シュガーがあります。さらに、私は私が書くことを可能にする自動実装されたプロパティが好きです public Foo foo { get; private set; } C ++では私は書く必要があります private: Foo foo; public: Foo getFoo() { return foo; } C ++ 11にはそのような概念があり、これに構文糖を付けることができますか?
93 c#  c++  class  c++11 

2
C ++で[=]はどういう意味ですか?
何[=]が知りたい?これが短い例です template &lt;typename T&gt; std::function&lt;T (T)&gt; makeConverter(T factor, T offset) { return [=] (T input) -&gt; T { return (offset + input) * factor; }; } auto milesToKm = makeConverter(1.60936, 0.0); []代わりにコードはどのように機能し[=]ますか? と思います std::function&lt;T (T)&gt; (T)引数として返され、型を返す関数プロトタイプを意味しますTか?
93 c++  c++11  lambda 

8
関数ポインターとしてのキャプチャーを備えたC ++ラムダ
私はC ++ラムダとそれらの関数ポインタへの暗黙の変換で遊んでいました。私の最初の例は、それらをftw関数のコールバックとして使用していました。これは期待どおりに機能します。 #include &lt;ftw.h&gt; #include &lt;iostream&gt; using namespace std; int main() { auto callback = [](const char *fpath, const struct stat *sb, int typeflag) -&gt; int { cout &lt;&lt; fpath &lt;&lt; endl; return 0; }; int ret = ftw("/etc", callback, 1); return ret; } キャプチャを使用するように変更した後: int main() { vector&lt;string&gt; entries; …

1
+を使用してラムダの関数ポインタとstd :: functionのあいまいなオーバーロードを解決する
次のコードでは、への最初の呼び出しfooがあいまいであるため、コンパイルに失敗します。 2番目は+、ラムダの前に追加され、関数ポインターオーバーロードに解決されます。 #include &lt;functional&gt; void foo(std::function&lt;void()&gt; f) { f(); } void foo(void (*f)()) { f(); } int main () { foo( [](){} ); // ambiguous foo( +[](){} ); // not ambiguous (calls the function pointer overload) } +ここでの表記は何ですか?

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