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

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


2
#pragmaはC ++ 11標準の一部でしたか?
従来、C ++での複数のヘッダーのインクルードを回避する標準的で移植可能な方法は、マクロガードスキーム#ifndef - #define - #endifとも呼ばれるプリコンパイラディレクティブスキームを使用することでした(現在のコードスニペットを参照)。 #ifndef MY_HEADER_HPP #define MY_HEADER_HPP ... #endif ただし、ほとんどの実装/コンパイラ(下の図を参照)では、と呼ばれるマクロガードスキームと同じ目的で使用できる、より「エレガントな」代替手段があります#pragma once。#pragma onceマクロガードスキームと比較して、コードの削減、名前の衝突の回避、場合によってはコンパイル速度の向上など、いくつかの利点があります。 調査を行ったところ、#pragma onceほとんどすべての既知のコンパイラーでディレクティブがサポートされています#pragma onceが、ディレクティブがC ++ 11標準の一部であるかどうかがわかりません。 質問: 誰か#pragma onceがC ++ 11標準の一部であるかどうかを誰かが明確にできますか? C ++ 11標準の一部ではない場合、それを今後のリリース(C ++ 14以降など)に含める予定はありますか? また、誰かがいずれかの手法(つまり、マクロガードと#pragma once)を使用する際の利点/欠点についてさらに詳しく説明できるとよいでしょう。

12
ユーザー定義リテラルがC ++に追加する新機能は何ですか?
C ++ 11を導入するユーザ定義リテラル既存のリテラルに基づいて新たなリテラル構文(の導入を可能にするint、hex、string、float任意のタイプのリテラルプレゼンテーションを持つことができるであろうように)。 例: // imaginary numbers std::complex<long double> operator "" _i(long double d) // cooked form { return std::complex<long double>(0, d); } auto val = 3.14_i; // val = complex<long double>(0, 3.14) // binary values int operator "" _B(const char*); // raw form int answer = 101010_B; // answer …

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名前を(期待どおり)使用できないのに、プライベートタイプで使用できるのはなぜですか?

3
効果的なC ++はまだ効果的ですか?
この投稿で目にしたことから、私は本「Effective C ++」を読み始めることにしました。 しかし、C ++ 11のために多くの新機能があり、いくつかの良い習慣が変わった今、それが実際に良いアイデアであるかどうかはわかりません。C ++ 11の登場により、Effective C ++に含まれるアドバイスが廃止されましたか?その場合、どのトピックを避けるべきですか?

5
いつstd :: thread :: detachを使用すればよいですか?
std::threadアプリケーションを高速化するために使用する必要がある場合があります。join()スレッドが完了するまで待機することも知っています。これは理解しやすいですが、detach()呼び出すことと呼び出さないことの違いは何ですか? なしdetach()では、スレッドのメソッドはスレッドを独立して使用して動作すると思いました。 切り離さない: void Someclass::Somefunction() { //... std::thread t([ ] { printf("thread called without detach"); }); //some code here } デタッチして呼び出す: void Someclass::Somefunction() { //... std::thread t([ ] { printf("thread called with detach"); }); t.detach(); //some code here }
139 c++  c++11  stdthread 

2
移動したオブジェクトで何ができますか?
規格は、オブジェクトが移動された後でオブジェクトに対して何ができるかを正確に定義していますか?移動元オブジェクトでできることはそれを破壊することだけだと思っていましたが、それだけでは不十分です。 たとえばswap、標準ライブラリで定義されている関数テンプレートを使用します。 template <typename T> void swap(T& a, T& b) { T c = std::move(a); // line 1 a = std::move(b); // line 2: assignment to moved-from object! b = std::move(c); // line 3: assignment to moved-from object! } 明らかに、移動元のオブジェクトに割り当てることが可能でなければなりません。そうしないと、2行目と3行目が失敗します。では、移動元オブジェクトで他に何ができるでしょうか?これらの詳細を規格のどこに正確に見つけることができますか? (ちなみに、なぜ1行目ではT c = std::move(a);なくなのT c(std::move(a));ですか?)

9
&&と||をオーバーロードする理由は実際にありますか?短絡しませんか?
短絡演算子の振る舞い&&とは、||プログラマのための素晴らしいツールです。 しかし、なぜオーバーロードするとこの動作が失われるのですか?演算子は関数の単なる構文糖であると理解していますが、演算子にboolはこのような振る舞いがあります。なぜこの単一の型に制限する必要があるのですか?この背後に技術的な理由はありますか?

10
C配列の初期化「int arr [] = {e1、e2、e3、…}」の動作をstd :: arrayでエミュレートする方法は?
(注:この質問は、要素の数を指定する必要はなく、ネストされた型を直接初期化できるようにする必要があります。) この質問では、のようなC配列の残りの使用について説明しint arr[20];ます で彼の答え、@James観世ショーC配列の最後の砦の一つ、それはユニークな初期特性です: int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 }; 要素の数を指定する必要はありません。ここで、C ++ 11関数std::beginとstd::endfrom <iterator>(または独自のバリアント)を使用して反復処理します。サイズについて考える必要はありません。 今、同じことを達成する(おそらくTMP)方法はありますstd::arrayか?見栄えを良くするために許可されたマクロの使用。:) ??? std_array = { "here", "be", "elements" }; 編集:さまざまな回答からコンパイルされた中間バージョンは、次のようになります。 #include <array> #include <utility> template<class T, class... Tail, class Elem = typename std::decay<T>::type> …

15
C ++でのコンパイル時文字列の便利な宣言
C ++でのコンパイル時に文字列を作成および操作できることには、いくつかの便利なアプリケーションがあります。C ++でコンパイル時の文字列を作成することは可能ですが、文字列を可変長文字列として宣言する必要があるため、プロセスは非常に面倒です。 using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>; 文字列連結、部分文字列抽出などの操作は、文字シーケンスの操作として簡単に実装できます。コンパイル時の文字列をより便利に宣言することは可能ですか?そうでない場合、コンパイル時の文字列の便利な宣言を可能にする作業の提案はありますか? 既存のアプローチが失敗する理由 理想的には、コンパイル時の文字列を次のように宣言できるようにしたいと思います。 // Approach 1 using str1 = sequence<"Hello, world!">; または、ユーザー定義のリテラルを使用して、 // Approach 2 constexpr auto str2 = "Hello, world!"_s; どこdecltype(str2)だろうconstexprコンストラクタを。アプローチ1の厄介なバージョンは、次のことができるという事実を利用して実装することが可能です。 template <unsigned Size, const char Array[Size]> struct foo; …


5
C ++ 11の新しい構文「= default」
私はなぜこれをするのか理解できません: struct S { int a; S(int aa) : a(aa) {} S() = default; }; なぜただ言ってはいけない: S() {} // instead of S() = default; なぜそのための新しい構文を導入するのですか?
136 c++  c++11 

13
タプルを可変長テンプレート関数の引数に拡張するにはどうすればよいですか?
可変個のテンプレート引数を持つテンプレート関数の場合を考えます。 template<typename Tret, typename... T> Tret func(const T&... t); 今、私はt値のタプルを持っています。func()引数としてタプル値を使用して呼び出すにはどうすればよいですか?bind()functionオブジェクトとcall()functionについて、そしてapply()いくつかの古くなったドキュメントで関数についても読みました。GNU GCC 4.4実装call()はbind()クラスに関数があるようですが、この件に関するドキュメントはほとんどありません。 一部の人々は手書きの再帰的ハックを提案しますが、可変テンプレートの引数の真の価値は、上記のような場合にそれらを使用できることです。 誰かが解決策を持っているか、それについてどこで読むべきかについてのヒントはありますか?
135 c++  c++11  arguments  tuples 

6
C ++ 11ランダムライブラリを使用して乱数を生成する
タイトルが示すように、私は新しいC ++ 11 <random>ライブラリを使用して乱数を生成する方法を理解しようとしています。私はこのコードでそれを試しました: std::default_random_engine generator; std::uniform_real_distribution<double> uniform_distance(1, 10.001); 私が持っているコードの問題は、コンパイルして実行するたびに、常に同じ数が生成されることです。だから私の質問は、ランダムライブラリの他の関数が本当にランダムでありながらこれを達成できるのですか? 私の特定の使用例では、範囲内の値を取得しようとしていました [1, 10]
135 c++  c++11  random  range 

4
ラムダのパラメーターの型と戻り値の型を理解することは可能ですか?
ラムダを考えると、それがパラメーターの型と戻り値の型を理解することは可能ですか?はいの場合、どのように? 基本的に、私はlambda_traitsこれを以下の方法で使用できるようにしたい: auto lambda = [](int i) { return long(i*10); }; lambda_traits<decltype(lambda)>::param_type i; //i should be int lambda_traits<decltype(lambda)>::return_type l; //l should be long 背後にある動機は、lambda_traits引数としてラムダを受け入れる関数テンプレートで使用したいことであり、関数内のパラメーターの型と戻りの型を知る必要があります。 template<typename TLambda> void f(TLambda lambda) { typedef typename lambda_traits<TLambda>::param_type P; typedef typename lambda_traits<TLambda>::return_type R; std::function<R(P)> fun = lambda; //I want to do this! //... } とりあえず、ラムダは引数を1つだけ取ると想定できます。 …

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