問題タブ [c++17]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++1z でフレンド テンプレート クラス テンプレートを宣言すると、エラーが発生します:「テンプレートの特殊化」class A' は名前空間に出現する必要があります
私はブースト asio コルーチンを使用しており、新しいファイルシステム TS (-stdc++fs) を使用したかったので、GCC 6-20151025 スナップショットにアップグレードしました。うまくいきました。しかし、-std=c++1z をオンにすると、boost のソース コードの奥深くでエラーが発生しました。エラーを分離しました。これは最小限の例です。
-std=c++14 で問題なくコンパイルされますが、-std=c++1z では次のエラーが生成されます。
ソースでエラーを追跡したところ、pt.c で新しく導入された関数「maybe_new_partial_specialization」で動作が分岐しているようです。特に、Concepts TS がアクティブな場合にのみアクティブになる状態で。
バグとして報告する前に、これが Concepts TS/C++1z で意図された動作であるかどうかを最初に確認したかったのです。
ありがとうございました。
編集:以下の回答に基づいて、それはバグであることが判明したため、ここで報告しました。
c++ - std::invoke(C++1z) はどのように機能しますか?
ここから上記の実装を見ました:
http://en.cppreference.com/w/cpp/utility/functional/invoke
次に、コンパイラが必要な正確なバージョンにどのように一致するのか疑問に思います。SFINAE は末尾の戻り型で機能しますか?
c++ - この変数が C++14 の g++ で initializer_list として推定されないのはなぜですか?
次のプログラムを検討してください。
オプションを使用しても、ideone で問題なくコンパイルされ-std=c++14
ます。ここでライブ デモを参照してください。しかし、C++14 では、変数はthisに従ってi
推定される必要があります。initializer_list
ブレースの初期化のための新しい型推定規則を実装する C++1z の提案があります。
直接リスト初期化の場合:
要素が 1 つしかない波括弧初期化リストの場合、自動推定はそのエントリから推定します。
複数の要素を持つ波括弧初期化リストの場合、自動推論は不適切な形式になります。
[例:
自動 x1 = { 1, 2 }; // decltype(x1) は std::initializer_list です
自動 x2 = { 1, 2.0 }; // エラー: 要素の型を推測できません
自動 x3{ 1, 2 }; // エラー: 単一の要素ではありません
自動 x4 = { 3 }; // decltype(x4) は std::initializer_list です
自動 x5{ 3 }; // decltype(x5) は int.
--終了例】
そのため、ルールは C++17 で変更されました。そのため、 を使用すると、プログラムはコンパイルされません-std=c++14
。これは g++ のバグですか? 変数は C++14 のようにi
推定されるべきではありませんか?initializer_list
c++ - erase-remove-idiom の便利なヘルパーが標準で提供されていないのはなぜですか?
STL のコレクションからアイテムを削除するには、イディオムになっている非常に頻繁に使用される手法が必要です:消去-削除-イディオム
このイディオムの最も一般的な使用法の 1 つは、あるタイプのアイテムT
をvector<T>
これは明らかに非常に冗長であり、DRY の原則に違反しています。問題のベクトルは 4 回必要です。
私の質問は、なぜ標準が便利なヘルパーを提供しないのですか?
何かのようなもの
また
これは明らかに次のように拡張できます。
等...
c++ - C++1z の公理の例は何ですか?
C++1z は概念 (制約 + 公理) を言語に導入する必要があります。すでに述べた公理 (再帰的、交換的、推移的) を除いて、他に役立つ公理は何ですか? 公理はコンパイラの最適化にのみ使用するべきですか、それとも別の目的にも使用できますか?
c++ - ラムダファンクター引数でrequire句を使用するには?
ラムダ ファンクターの引数に一般的な requires 句を適用する方法はありますか?
2 つの制約がC1
ありC2
、引数に対してチェックしたいとします。関数には同様の構文が許可されているため、次のように動作すると予想していました。
しかし、これはGCC 6ではコンパイルできません。
c++ - SFINAE とオーバーロードされた関数のアドレス
bar
別の関数のパラメーター ( foo1
/ ) のコンテキストで、オーバーロードされた関数 ( ) のアドレスを解決しようとしていますfoo2
。
の型を明示的foo1
に指定する に問題はありません。bar
ただし、foo2
の 1 つを除くすべてのバージョンに対して SFINAE を介してそれ自体を無効bar
にすると、次のメッセージが表示されてコンパイルに失敗します。
C++ では、オーバーロードされた関数のアドレスを解決すると同時に、テンプレート引数の推定を実行できないことを理解しています。
それが原因ですか?foo2<Baz>(bar);
(または同様のもの) をコンパイルする方法はありますか?
c++ - :: で始まる C++ のネストされた名前空間定義
ドラフト §7.3.1¶1 (n4527) では、名前空間定義の文法には以下が含まれます。
囲み名前空間指定子:
識別子
囲み名前空間指定子 :: 識別子
これにより、名前空間の定義が「::」で始まる識別子を持つことができなくなります
その制限には何か理由がありますか?
更新: 反対票といくつかの回答により、最初の文で「ドラフト」を意味するときに「標準」と書いたことに気づきました。私の弁護では、括弧内に文書番号を書きました。したがって、これは C++1z のネストされた名前空間定義機能に関する質問であることを強調しておきます。
c++ - このコードを constexpr にするにはどうすればよいですか? (標準::クロノ)
標準文書 P0092R1 で、Howard Hinnant は次のように書いています。
このコードはどのように機能しますか? 問題は、operator--
on astd::chrono::duration
が constexpr 操作ではないことです。次のように定義されています。
それでも、このコードはコンパイルされ、コンパイル時に正しい答えが得られます。
どうしたの?