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

C ++ 14は2014年に承認されたC ++標準の名前です。これは以前のC ++ 11標準に基づいて構築されており、コア言語と標準ライブラリを改善し、いくつかの機能を追加しています。

3
C ++ 17、C ++ 14、およびC ++ 11オブジェクトをリンクしても安全ですか
3つのコンパイル済みオブジェクトがあり、すべて同じコンパイラ/バージョンで生成されているとします。 AはC ++ 11標準でコンパイルされました BはC ++ 14標準でコンパイルされました CはC ++ 17標準でコンパイルされました 簡単にするために、すべてのヘッダーがC ++ 11で記述されており、3つの標準バージョン間でセマンティクスが変更されていない構成体のみを使用しているため、相互依存関係がヘッダーインクルードで正しく表現され、コンパイラーが異議を唱えなかったとします。 これらのオブジェクトのどの組み合わせがそれであり、単一のバイナリにリンクするのは安全ではありませんか?どうして? 編集:主要なコンパイラ(gcc、clang、vs ++など)に関する回答を歓迎します
97 c++  c++11  linker  c++14  abi 

6
error :: make_uniqueは「std」のメンバーではありません
コードレビューに投稿された次のスレッドプールプログラムをコンパイルしてテストしようとしています。 /codereview/55100/platform-independant-thread-pool-v4 しかし、私はエラーが発生しています threadpool.hpp: In member function ‘std::future<decltype (task((forward<Args>)(args)...))> threadpool::enqueue_task(Func&&, Args&& ...)’: threadpool.hpp:94:28: error: ‘make_unique’ was not declared in this scope auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>> (std::move(bound_task), std::move(promise)); ^ threadpool.hpp:94:81: error: expected primary-expression before ‘>’ token auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>>(std::move(bound_task), std::move(promise)); ^ main.cpp: In function ‘int main()’: main.cpp:9:17: error: …

2
メンバーが1つだけの組合を使用する目的は何ですか?
seastarのソースコードを読んでいたときに、tx_sideメンバーが1つだけのと呼ばれる共用体構造があることに気付きました。これは特定の問題に対処するためのハックですか? tx_side参考までに、以下の構造を貼り付けます。 union tx_side { tx_side() {} ~tx_side() {} void init() { new (&a) aa; } struct aa { std::deque<work_item*> pending_fifo; } a; } _tx;
89 c++  c++14  unions 

5
ラムダのサイズが1バイトなのはなぜですか?
C ++でいくつかのラムダのメモリを使用していますが、そのサイズに少し戸惑っています。 これが私のテストコードです: #include <iostream> #include <string> int main() { auto f = [](){ return 17; }; std::cout << f() << std::endl; std::cout << &f << std::endl; std::cout << sizeof(f) << std::endl; } ここで実行できます:http : //fiddle.jyt.io/github/b13f682d1237eb69ebdc60728bb52598 出力は次のとおりです。 17 0x7d90ba8f626f 1 これは、ラムダのサイズが1であることを示唆しています。 これはどのようにして可能ですか? ラムダは、少なくとも、その実装へのポインタであってはなりませんか?
89 c++  c++11  lambda  c++14  sizeof 

3
const voidとは何ですか?
の説明はstd::is_void次のように述べています。 Tがタイプvoid、const void、volatile void、またはconst volatile voidの場合、trueに等しいメンバー定数値を提供します。 それでは、、const voidまたはvolatile void? この回答は、const void戻り値の型が無効になることを示しています(ただし、VC ++ 2015でコンパイルされます) const void foo() { } 標準でconst void無効な場合(VCが間違っている)-それでは何const voidですか?
89 c++  c++11  c++14 

3
デフォルト、値、ゼロの初期化の混乱
値とデフォルトとゼロの初期化について非常に混乱しています。特に、異なる標準C ++ 03とC ++ 11(およびC ++ 14)を採用する場合。 私はここで本当に良い答えを引用して拡張しようとしています値-/デフォルト-/ゼロ-初期化C ++ 98とC ++ 03誰かが記入するのを手伝ってくれるなら多くのユーザーを助けるので、それをより一般的にしますいつ何が起こるかについての概要を把握するためにギャップが必要でしたか? 一言で言えば例による完全な洞察: new演算子によって返されるメモリが初期化される場合もあれば、新しい型がPOD(単純な古いデータ)であるかどうか、またはPODメンバーを含み、を使用しているクラスであるかどうかに依存しない場合もあります。コンパイラーが生成したデフォルトのコンストラクター。 ではC ++ 1998:初期化の2種類があるゼロとデフォルトの初期化は、 C ++ 2003の初期化の3種類、値初期化を加えました。 C ++ 2011 / C ++ 2014のみリストの初期化は、添加し、そしてための規則値- / default- /ゼロ初期化は、ビットを変更しました。 仮定: struct A { int m; }; struct B { ~B(); int m; }; struct C { C() : m(){}; …
88 c++  c++11  c++14  c++03  c++98 

3
C ++ 17以降、正しいアドレスとタイプのポインターは常に有効なポインターですか?
(この質問と回答を参照してください。) C ++ 17標準の前は、次の文が[basic.compound] / 3に含まれていました。 タイプTのオブジェクトがアドレスAにある場合、値がアドレスAであるタイプcv T *のポインターは、値の取得方法に関係なく、そのオブジェクトを指していると言われます。 しかし、C ++ 17以降、この文は削除されました。 たとえば、この文によってこのサンプルコードが定義され、C ++ 17以降は未定義の動作であると思います。 alignas(int) unsigned char buffer[2*sizeof(int)]; auto p1=new(buffer) int{}; auto p2=new(p1+1) int{}; *(p1+1)=10; C ++ 17より前p1+1は、へのアドレスを保持し*p2、正しい型を持っているので*(p1+1)、へのポインタもそうです*p2。C ++で17p1+1ある過去エンドポインタになっていないので、オブジェクトへのポインタと、私はそれがdereferencableではないと信じています。 この標準的な権利の変更の解釈ですか、それとも引用された文の削除を補償する他の規則がありますか?

5
ラムダ自体内のC ++ラムダ関数のアドレスを取得するにはどうすればよいですか?
それ自体の中でラムダ関数のアドレスを取得する方法を理解しようとしています。これがサンプルコードです: []() { std::cout << "Address of this lambda function is => " << ???? }(); ラムダを変数にキャプチャしてアドレスを出力できることはわかっていますが、この無名関数が実行されているときにそれを実行したいと考えています。 これを行う簡単な方法はありますか?
53 c++  c++11  lambda  c++14  c++17 

1
C ++ 14とC ++ 17ではstd :: atomicコンストラクターの動作が異なるのはなぜですか
C ++ 11のプロジェクトで作業していて、次のコードを試してみました #include <atomic> struct A { std::atomic_int idx = 1; }; int main() { return 0; } コンパイラエラーが発生する error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]' std::atomic_int idx = 1; ^ C ++ 14でも同じ結果になります。C ++ 17に切り替えると機能します:wandbox 私はcppreferenceの違いをチェックしました: std::atomic std::atomic<T>::operator= std::atomic<T>::atomic しかし、C ++ 14とC ++ 17の間に文書化された違いはありません。C …
19 c++  c++14  c++17  stdatomic 

3
ラムダクロージャの左辺値を右辺値参照パラメータとして渡すことができます
lvalueラムダクロージャーは常にrvalue関数パラメーターとして渡すことができることがわかりました。 次の簡単なデモをご覧ください。 #include <iostream> #include <functional> using namespace std; void foo(std::function<void()>&& t) { } int main() { // Case 1: passing a `lvalue` closure auto fn1 = []{}; foo(fn1); // works // Case 2: passing a `lvalue` function object std::function<void()> fn2 = []{}; foo(fn2); // compile error return 0; } …

4
連続列挙型C ++ 11
列挙型が連続しているかどうかをC ++ 11でチェックする方法はありますか? ない列挙値を与えることは完全に有効です。C ++ 14、C ++ 17、またはC ++ 20の型特性のような機能があるのでしょうか?これはstatic_assertで使用されます。 次に小さな例を示します。 enum class Types_Discontinuous { A = 10, B = 1, C = 100 }; enum class Types_Continuous { A = 0, B = 1, C = 2 }; static_assert(SOME_TEST<Types_Discontinuous>::value, "Enum should be continuous"); // Fails static_assert(SOME_TEST<Types_Continuous>::value, "Enum should be …
17 c++  c++11  c++14  c++17  c++20 

3
関数が定義されているタイプに対してのみ、関数テンプレート内で関数を実行します
入力としてさまざまなタイプを受け取る関数テンプレートがあります。それらのタイプのうち、そのうちの1つだけがgetInt()機能を持っています。したがって、コードでそのタイプに対してのみ関数を実行する必要があります。解決策を提案してください。ありがとう #include <type_traits> #include <typeinfo> class X { public: int getInt(){ return 9; } }; class Y{ }; template<typename T> void f(T& v){ // error: 'class Y' has no member named 'getInt' // also tried std::is_same<T, X>::value if(typeid(T).name() == typeid(X).name()){ int i = v.getInt();// I want this to be called …

1
バージョン間でC ++の式の型が変更されたのはなぜですか?
私はC ++の式のタイプを理解しようとしますが、C ++ドラフトを消化するのは非常に難しく、したがって他のリソースを好むので、読むほど混乱します。 C ++バージョン間の表現と定義が大幅に変更されています。 以下では、以下のドラフトを参照します。 C ++ 11 [ n3690 ](最終ドラフト) C ++ 17 [ n4659 ](最終ドラフト) C ++ 20 [ n4835 ](現在のドラフト) C++11 3.10左辺値と右辺値 ... prvalue(「純粋な」右辺値)は、x値ではない右辺値です。[例:戻り値の型が参照ではない関数を呼び出した結果は、prvalueです。12、7.3e5、trueなどのリテラルの値もprvalueです。—最後の例] C++17 3.10左辺値と右辺値 ... prvalueは、評価によってオブジェクトまたはビットフィールドを初期化するか、演算子のオペランドの値を、それが出現するコンテキストで指定されたとおりに計算する式です。 C++20 7.2.1値のカテゴリ* ... prvalueは、その評価がオブジェクトまたはビットフィールドを初期化する式、または演算子のオペランドの値を、それが出現するコンテキストまたはcv void型の式で指定されているように計算する式です。 言い回しの変更を理解し、いくつかの調整が行われますが、私にとっては定義全体が変更されます。誰かがこれを理解するのを手伝ってくれる?たとえば、prvalueがxvalueではないrvalueであるという文が削除されたのはなぜですか?または、なぜ役立つ例が削除されたのですか?
13 c++  c++11  c++14  c++17  c++20 

1
変数テンプレートをテンプレートテンプレート引数として渡すことはできますか?
次の無意味な例はコンパイルされませんが、変数テンプレートをテンプレートテンプレート引数として渡す他の方法はありますか? template<typename T> constexpr auto zero = T{0}; template<typename T, template<typename> auto VariableTemplate> constexpr auto add_one() { return VariableTemplate<T> + T{1}; } int main() { return add_one<int, zero>(); } コンパイラエクスプローラーを試す

1
パイプライブラリ機能に範囲を使用できないのはなぜですか?
Jonathan Boccara(Fluent C ++の作者)がpipesというライブラリを作成しました。 リポジトリのメインページにあるこの「パイピング」は、見た目は同じですが、範囲の使用とは異なります。遅延プルではなく、積極的なプッシュに基づいています。しかし、範囲ライブラリを使用してさまざまな「パイプ」操作を実行することはできないと述べられています。例えば: unzip-圧縮された入力(基本的に一連のkタプル)を取り、kの独立した独立した出力を生成します。 fork-コンテナー/範囲の複数の(独立した)コピーを生成します。 なぜそうなるのか、原理的にはよくわかりません。(もちろん、終了イテレータ/センチネルを取得できない範囲を除いて。)

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