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

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


4
最新のC ++の実験的な機能は、長期的なプロジェクトに対して信頼できますか?
現在C ++ 11/14を使用しているプロジェクトがstd::filesystemありますが、C ++ 17でのみ使用可能なのようなものが必要であるため、現在使用する機会がありません。ただし、現在のコンパイラではstd::experimental::filesystem。として使用できるようです。将来、次のようなものを追加できると仮定して、実験的な機能を使用することをお勧めしますか? #ifdef CXX17 //if this is C++17 std::filesystem::something ...; #else std::experimental::filesystem::something ...; #endif 私の懸念は次のとおりです。 1.すべての準拠コンパイラが同じ実験機能を備えていることが保証されていますか? 2.実験的な機能は、信頼性を低下させる大きな変更が発生する傾向がありますか? たぶん、疑問に思うことがもっとあります。なぜそれらを使用する必要があるのですか、または使用しないのですか?私は新しいプロジェクトに戸惑い、何を決めるのかわかりません。


6
プレーン配列の範囲ベースの作業はどのように行われますか?
C ++ 11では、他の言語のforように機能する範囲ベースを使用できますforeach。プレーンなC配列でも機能します。 int numbers[] = { 1, 2, 3, 4, 5 }; for (int& n : numbers) { n *= 2; } いつ停止するかをどうやって知るのですか?forが使用されているのと同じスコープで宣言されている静的配列でのみ機能しますか?これforを動的配列でどのように使用しますか?
87 c++  arrays  foreach  c++11 


3
C ++ 11では、非静的メンバーと非定数メンバーのクラス内初期化が可能です。何が変わったの?
C ++ 11より前は、整数型または列挙型の静的constメンバーに対してのみクラス内初期化を実行できました。Stroustrupは、C ++ FAQでこれについて説明し、次の例を示しています。 class Y { const int c3 = 7; // error: not static static int c4 = 7; // error: not const static const float c5 = 7; // error: not integral }; そして、次の理由: では、なぜこれらの不便な制限が存在するのでしょうか。クラスは通常、ヘッダーファイルで宣言され、ヘッダーファイルは通常多くの変換ユニットに含まれます。ただし、複雑なリンカールールを回避するために、C ++ではすべてのオブジェクトに一意の定義が必要です。C ++で、オブジェクトとしてメモリに格納する必要のあるエンティティのクラス内定義が許可されている場合、このルールは破られます。 ただし、C ++ 11はこれらの制限を緩和し、非静的メンバーのクラス内初期化を可能にします(§12.6.2/ 8)。 非委任コンストラクターで、特定の非静的データメンバーまたは基本クラスがmem-initializer-idで指定されていない場合(コンストラクターにctor-initializerがないためにmem-initializer-listがない場合を含む)エンティティが抽象クラス(10.4)の仮想基本クラスではない場合、 エンティティが中括弧または等しい初期化子を持つ非静的データメンバーである場合、エンティティは8.5で指定されているように初期化されます。 それ以外の場合、エンティティがバリアントメンバー(9.5)の場合、初期化は実行されません。 それ以外の場合、エンティティはデフォルトで初期化されます(8.5)。 セクション9.4.2では、非const静的メンバーがconstexpr指定子でマークされている場合、それらのクラス内初期化も許可されます。 …


4
constメンバー関数が静的データメンバーを変更できるのはなぜですか?
次のC++プログラムでは、関数から静的データメンバーを変更するconstことは正常に機能しています。 class A { public: static int a; // static data member void set() const { a = 10; } }; ただし、関数から非静的データメンバーを変更するconstことはできません。 class A { public: int a; // non-static data member void set() const { a = 10; } }; constメンバー関数がstaticデータメンバーを変更できるのはなぜですか?
86 c++  function  c++11  static  const 

4
XcodeでC ++ 11を使用できますか?
autoいくつかのクロスプラットフォームプロジェクト(Windows + Mac)でいくつかのC ++ 11機能(たとえば)の使用を検討しています。Windowsでは、VisualStudioはコードベースの一部を単純化できるようになる次のC ++ 11標準の一部をサポートしているので、当然、これらの機能の使用を開始することに興味があります。 しかし、私が知る限り、現在のXCodeバージョン(3.2.4 + GCC 4.2)はC ++ 11機能をまったくサポートしていません。どういうわけかGCCバージョンまたはCLangバージョンをアップグレードできますか?それとも、私はただ舌を噛んで、Appleが将来いつか新しいバージョンをパッケージ化するのを待つべきですか?
86 c++  xcode  gcc  c++11  clang 

10
プリティプリントstd :: tuple
これは、プリティプリントSTLコンテナに関する以前の質問のフォローアップであり、非常にエレガントで完全に一般的なソリューションを開発することができました。 この次のステップではstd::tuple<Args...>、可変個引数テンプレートを使用して、のプリティプリントを含めたいと思います(したがって、これは厳密にC ++ 11です)。のためにstd::pair<S,T>、私は単に言う std::ostream & operator<<(std::ostream & o, const std::pair<S,T> & p) { return o << "(" << p.first << ", " << p.second << ")"; } タプルを印刷するための類似の構造は何ですか? テンプレート引数スタックをアンパックし、インデックスを渡し、SFINAEを使用して最後の要素に到達したことを検出しようとしましたが、成功しませんでした。壊れたコードであなたに負担をかけないでください。問題の説明は、うまくいけば十分に簡単です。基本的に、次の動作が必要です。 auto a = std::make_tuple(5, "Hello", -0.1); std::cout << a << std::endl; // prints: (5, "Hello", -0.1) 前の質問と同じレベルの一般性(char / wchar_t、ペア区切り文字)を含めることのボーナスポイント!

16
負の数を処理するC / C ++ / Obj-Cでモジュロ(%)演算子をコーディングする方法
(数学者としての)C派生言語に対する私のペットの嫌いなものの1つはそれです (-1) % 8 // comes out as -1, and not 7 fmodf(-1,8) // fails similarly What's the best solution? C++ allows the possibility of templates and operator overloading, but both of these are murky waters for me. examples gratefully received.

8
C ++ 0xでの変換の絞り込み。それは私だけですか、それともこれは壊滅的な変化のように聞こえますか?
C ++ 0xは、aから。へのいわゆるナローイング変換を必要とするため、次のコードおよび同様のコードを不正な形式doubleにしintます。 int a[] = { 1.0 }; この種の初期化が実際のコードで多く使用されているかどうか疑問に思います。この変更によっていくつのコードが壊れますか?コードがまったく影響を受けている場合、コードでこれを修正するのは大変な努力ですか? 参考までに、n3225の8.5.4 / 6を参照してください。 ナローイング変換は暗黙的な変換です 浮動小数点型から整数型へ、または long doubleからdoubleまたはfloat、またはdoubleからfloat。ただし、ソースが定数式であり、変換後の実際の値が表現可能な値の範囲内にある場合(正確に表現できない場合でも)、または ソースが定数式であり、変換後の実際の値がターゲットタイプに適合し、元のタイプに変換されたときに元の値を生成する場合を除いて、整数型またはスコープなしの列挙型から浮動小数点型へ、または 整数型またはスコープなしの列挙型から、元の型のすべての値を表すことができない整数型へ。ただし、ソースが定数式であり、変換後の実際の値がターゲット型に適合し、次の場合に元の値を生成する場合を除きます。元のタイプに変換されます。

13
C ++のvolatileキーワードはメモリフェンスを導入しますか?
volatile値が変更される可能性があることをコンパイラに通知することを理解していますが、この機能を実現するために、コンパイラはそれを機能させるためにメモリフェンスを導入する必要がありますか? 私の理解では、揮発性オブジェクトに対する一連の操作は並べ替えることができず、保持する必要があります。これは、いくつかのメモリフェンスが必要であり、これを回避する方法が実際にはないことを意味しているようです。私はこれを言うのは正しいですか? この関連する質問で興味深い議論があります ジョナサンウェイクリーは書いています: ...個別の揮発性変数へのアクセスは、それらが別々の完全な式で発生する限り、コンパイラーによって並べ替えることはできません...揮発性はスレッドセーフには役に立たないが、彼が与える理由ではありません。これは、コンパイラが揮発性オブジェクトへのアクセスを並べ替える可能性があるためではなく、CPUがそれらを並べ替える可能性があるためです。アトミック操作とメモリバリアにより、コンパイラとCPUの並べ替えが妨げられます これにデビッド・シュワルツ氏は返信コメントで: ... C ++標準の観点からは、コンパイラが何かを実行することと、コンパイラがハードウェアに何かを実行させる命令を発行することとの間に違いはありません。CPUが揮発性物質へのアクセスを並べ替える可能性がある場合、標準ではそれらの順序を保持する必要はありません。..。 ... C ++標準では、並べ替えの内容を区別していません。そして、CPUが観察可能な影響なしにそれらを並べ替えることができると主張することはできないので、それは問題ありません-C ++標準はそれらの順序を観察可能として定義しています。コンパイラーは、プラットフォームに標準が要求することを実行させるコードを生成する場合、プラットフォーム上のC ++標準に準拠しています。標準が揮発性物質へのアクセスを並べ替えないことを要求している場合、プラットフォームは揮発性物質を並べ替えることに準拠していません。..。 私のポイントは、C ++標準がコンパイラーによる個別の揮発性物質へのアクセスの並べ替えを禁止している場合、そのようなアクセスの順序はプログラムの観察可能な動作の一部であるという理論に基づいて、CPUが実行することを禁止するコードを発行することもコンパイラーに要求するということです。そう。この規格は、コンパイラーが行うことと、コンパイラーの生成コードがCPUに行うことを区別していません。 どちらが2つの質問をもたらします:どちらかが「正しい」ですか?実際の実装は実際に何をしますか?

4
C ++ 11のthread_local変数は自動的に静的ですか?
これら2つのコードセグメントに違いはありますか? void f() { thread_local vector<int> V; V.clear(); ... // use V as a temporary variable } そして void f() { static thread_local vector<int> V; V.clear(); ... // use V as a temporary variable } 裏話:元々、静的ベクトルV(いくつかの中間値を保持するために、関数に入るたびにクリアされます)とシングルスレッドプログラムがありました。プログラムをマルチスレッドプログラムに変えたいので、どういうわけかこの静的修飾子を取り除く必要があります。私の考えは、すべての静的オブジェクトをthread_localに変換し、他に何も心配しないことです。これは裏目に出ることができますか?

2
すでに構築されたオブジェクトに対するstd :: moveとemplace_back()を使用したC ++ 11 push_back()の効率
C ++ 11では、インプレース構築が可能であるemplace_back()ため、(効率の観点から)一般的に好まれますが、すでに構築されたオブジェクトで使用する場合も同様ですか?push_back()push_back(std::move()) たとえばemplace_back()、次のような場合でもまだ好まれますか? std::string mystring("hello world"); std::vector<std::string> myvector; myvector.emplace_back(mystring); myvector.push_back(std::move(mystring)); // (of course assuming we don't care about using the value of mystring after) さらに、上記の例には、代わりに次のような利点がありますか。 myvector.emplace_back(std::move(mystring)); または、ここでの移動は完全に冗長ですか、それとも効果がありませんか?

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