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

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


1
クラスが独自のプライベート静的constexprメソッドにアクセスできない-Clangバグ?
このコードはClang(6、7、8、9、trunk)ではコンパイルされませんが、GCC(7.1、8.1、9.1)では問題なくコンパイルされます。 template<class T> struct TypeHolder { using type = T; }; template<int i> class Outer { private: template<class T> static constexpr auto compute_type() { if constexpr (i == 42) { return TypeHolder<bool>{}; } else { return TypeHolder<T>{}; } } public: template<class T> using TheType = typename decltype(Outer<i>::compute_type<T>())::type; }; int main() …

3
変換演算子のこのオーバーロードが選択されるのはなぜですか?
次のコードを検討してください。 struct any { template <typename T> operator T &&() const; template <typename T> operator T &() const; }; int main() { int a = any{}; } ここで、2番目の変換演算子は、過負荷の解決によって選択されます。どうして? 私の理解する限り、2つの演算子はそれぞれoperator int &&() constとに推定されoperator int &() constます。どちらも実行可能な関数のセットに含まれています。[over.match.best]を読んでも、後者が優れている理由を理解するのに役立ちませんでした。 なぜ後者は前者よりも機能が優れているのですか?

3
C ++でタイプリストの方法デカルト積を作成するにはどうすればよいですか?
自明です。 基本的に、次のようなタイプのリストがあるとします。 using type_list_1 = type_list<int, somestructA>; using type_list_2 = type_list<somestructB>; using type_list_3 = type_list<double, short>; タイプリストの可変数にすることができます。 デカルト積のタイプリストを取得するにはどうすればよいですか? result = type_list< type_list<int, somestructB, double>, type_list<int, somestructB, short>, type_list<somestructA, somestructB, double>, type_list<somestructA, somestructB, short> >; 私はここに与えられているように双方向のデカルト積を作成する方法について手を出しました:タイプリストのデカルト積を作成する方法?、しかしnウェイはそれほど簡単ではないようです。 とりあえずやっています... template <typename...> struct type_list{}; // To concatenate template <typename... Ts, typename... Us> constexpr auto …

3
shared_ptrのdeleterは、カスタムアロケーターによって割り当てられたメモリに格納されていますか?
私が持っていると言うshared_ptrカスタムアロケータでとカスタム削除手段。 削除プログラムを保存する場所について話している標準では何も見つかりません。カスタムアロケータが削除プログラムのメモリに使用されることはなく、そうでないこともありません。 これは指定されていませんか、それとも何か不足していますか?

4
戻り時に暗黙的な変換は許可されていません
#include <optional> bool f() { std::optional<int> opt; return opt; } コンパイルしません: 'return': cannot convert from 'std::optional<int>' to 'bool' 参考資料を参考にして説明を探したのですが、大丈夫なので読んでみました。 暗黙的な変換は、あるタイプT1の式がそのタイプを受け入れないが他のタイプT2を受け入れるコンテキストで使用される場合は常に実行されます。特に: T2をパラメーターとして宣言された関数を呼び出すときに、式が引数として使用される場合。 式がT2を期待する演算子でオペランドとして使用される場合。 T2を返す関数のreturnステートメントを含む、T2型の新しいオブジェクトを初期化するとき; 式がswitchステートメントで使用されている場合(T2は整数型)。 式がifステートメントまたはループで使用される場合(T2はブール値)。

3
指定されたstd :: variant型を指定された基準で分割します
特定のバリアントタイプによる方法 using V = std::variant<bool, char, std::string, int, float, double, std::vector<int>>; 2つのバリアント型を宣言する using V1 = std::variant<bool, char, int, float, double>; using V2 = std::variant<std::string, std::vector<int>>; どこV1からすべての算術型を含んVとV2から、すべての非算術型が含まれてV? V テンプレートクラスのパラメータにすることができます。次に例を示します。 template <class V> struct TheAnswer { using V1 = ?; using V2 = ?; }; 一般に、基準は次のようなconstexpr変数にすることができます。 template <class T> constexpr bool filter;
20 c++  c++17  std-variant 

1
テンプレートの自動戻りタイプとあいまいさ
オーバーロードされたテンプレート関数があります: template<typename T1, typename T2> auto overMax(T1 a, T2 b) { std::cout << __FUNCSIG__ << std::endl; return b < a ? a : b; } template<typename RT, typename T1, typename T2> RT overMax(T1 a, T2 b) { std::cout << __FUNCSIG__ << std::endl; return b < a ? a : b; …

4
std :: back_inserterでstd :: transformを使用することは有効ですか?
Cppreferenceには、次のサンプルコードがありstd::transformます。 std::vector<std::size_t> ordinals; std::transform(s.begin(), s.end(), std::back_inserter(ordinals), [](unsigned char c) -> std::size_t { return c; }); しかし、それはまた言います: std::transformunary_opまたはの順序どおりの適用は保証されませんbinary_op。関数をシーケンスに順番に適用したり、シーケンスの要素を変更する関数を適用したりするには、を使用しますstd::for_each。 これはおそらく並列実装を可能にするためです。しかし、の3番目のパラメータは、std::transformあるLegacyOutputIteratorため、次の事後条件を有しています++r。 この操作の後rは、増分可能である必要はなく、以前の値のコピーは、r逆参照可能または増分可能である必要がなくなります。 したがって、出力の割り当ては順番に行わなければならないように思えます。それらは単に、アプリケーションunary_opが故障し、一時的な場所に保存されているが、出力に順番にコピーされる可能性があることを意味していますか?それはあなたがしたいことのようには聞こえません。 ほとんどのC ++ライブラリは、実際には並列実行プログラムをまだ実装していませんが、Microsoftは実装しています。私はかなり確信している、これは関連するコードである、と私は考えてそれが呼び出すこのpopulate()機能をするので確実に行うために有効なものではありません出力、のチャンクにレコードイテレータに LegacyOutputIteratorそれのコピーをインクリメントすることによって無効にすることができます。 何が欠けていますか?

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 

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 

1
グローバルconst char []をconstexpr string_viewに置き換える落とし穴はありますか?
私たちのチームは10年以上前のC ++コードベースで作業しており、最近C ++ 17コンパイラに切り替えました。そこで、コードを最新化する方法を探しています。YouTubeでのカンファレンストークで、const char*グローバル文字列をに置き換えるという提案を聞きましたconstexpr string_view。 const char*コードにはこのようなグローバル文字列定数が多数含まれているので、知っておく必要のある問題や潜在的な問題がないか確認したいのですが。

1
std :: pair <auto、auto>戻り値の型
で遊んでいましautoたstd::pair。以下のコードでfは、関数はstd::pairテンプレートパラメータに依存するタイプのを返すことになっています。 実際の例: 例1 template &lt;unsigned S&gt; auto f() { if constexpr (S == 1) return std::pair{1, 2}; // pair of ints else if constexpr (S == 2) return std::pair{1.0, 2.0}; // pair of doubles else return std::pair{0.0f, 0.0f}; // pair of floats } これは、gcc 9.2、gcc 10.0、clang 9.0およびclang 10.0で動作します。 次に、明確にするために戻り値の型を明示的に記述したいと思いstd::pairます。 例2 …

1
C ++コンパイラーはどのようにして外部変数を見つけますか?
このプログラムをg ++とclang ++でコンパイルします。違いがあります: g ++は1を出力しますが、clang ++は2を出力 します 。g++:extern変数は最も短いスコープで定義されているようです。 clang ++:extern変数は最短のグローバルスコープで定義されます。 C ++仕様にはその仕様がありますか? main.cpp #include &lt;iostream&gt; static int i; static int *p = &amp;i; int main() { int i; { extern int i; i = 1; *p = 2; std::cout &lt;&lt; i &lt;&lt; std::endl; } } other.cpp int i; バージョン:g ++:7.4.0 …

1
__func__ポインターの2つのconstexprインスタンスの違いはまだconstexprですか?
これは有効なC ++ですか? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCCとMSVCは大丈夫だと思っていますが、Clangはそうではないと思っています:Compiler Explorer。 すべてのコンパイラは、これが問題ないことに同意しています:コンパイラエクスプローラー。 int main() { constexpr auto p = __func__; constexpr auto p2 = p; constexpr auto sz = p2 - p; return sz; } Clangはこれも好きではありませんが、他のものは問題ありません:Compiler Explorer int main() { constexpr auto p = …

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