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

C ++ 20は、C ++ 17以降のバージョンのC ++のターゲットです。このタグは、C ++ 20で予定されているC ++機能に関する質問には(C ++タグとともに)使用する必要があります。


3
C ++ 20の概念:テンプレート引数が複数の概念に該当する場合、どのテンプレートの特殊化が選択されますか?
与えられた: #include <concepts> #include <iostream> template<class T> struct wrapper; template<std::signed_integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "signed_integral" << std::endl; } }; template<std::integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "integral" << std::endl; } }; int main() { wrapper<int> w; …

1
関数パラメーターのテンプレート引数プレースホルダーとしての「auto」
C ++ 20ではauto、関数パラメーター型を使用できます。 関数パラメーター型のautoテンプレート引数プレースホルダーとして使用することもできますか(似ていないが、C ++ 17 template <auto>の精神で)。 したがって、C ++ 20より前の次のコード: template<typename First, typename Second> void printPair(const std::pair<First, Second>& p) { std::cout << p.first << ", " << p.second; } 次のように書くことができます: void printPair(const std::pair<auto, auto>& p) { std::cout << p.first << ", " << p.second; } それはコンパイルし、概念の実験的なGCC実装でうまく動作します。 C ++ 20での正当な構文ですか?
22 c++  templates  auto  c++20 

1
独自の初期化子での変数の使用
C ++ 20標準草案の[basic.scope.pdecl] / 1には、次の(非規範的)例が注記(プルリクエスト3580のマージ前の部分的な引用、この質問への回答を参照)に含まれていました。 unsigned char x = x; [...] xは、独自の(不定)値で初期化されます。 これは実際にC ++ 20で明確に定義された動作を持っていますか? 一般に、フォームの自己初期化は、初期化が完了する前のの値が不定であるT x = x;ため、未定義の動作をします。不確定な値を評価すると、通常、未定義の動作([basic.indent] / 2)が発生しますが、[basic.indent] /2.3には、不確定な値を持つ左辺値から変数を直接初期化できる特定の例外があります(不確定な値で初期化が発生します) )。xunsigned charunsigned char これだけでは、したがって、未定義の動作を引き起こすが、他のタイプの場合としないT符号なしの狭い文字タイプかそうでないstd::byte、例えばint x = x;。C ++ 17以前にも適用されたこれらの考慮事項は、下部にあるリンクされた質問も参照してください。 ただし、でもunsigned char x = x;、現在のドラフトの[basic.lifetime] / 7は次のように述べています。 同様に、オブジェクトの存続期間が始まる前に[...]その値に依存しないglvalueのプロパティを使用することは明確に定義されています。次の場合、プログラムは未定義の動作をします。 glvalueは、オブジェクトにアクセスするために使用されます。 [...] これはx、例のの値がその存続期間中にのみ使用できることを意味するようです。 [basic.lifetime] / 1は言う: [...] タイプTのオブジェクトの存続期間は、次の場合に始まります。 [...]と 初期化(存在する場合)が完了している(空の初期化を含む)([dcl.init])、 [...] …

2
PODタイプであることは、単純な標準レイアウトタイプであることとまったく同じですか?
C ++ 20では、PODの概念は推奨されません。これは、それがささいで標準的なレイアウトであるという意味のない複合特性であるためと考えられます。ただし、C ++ 20ドラフトでのPODの定義は、厳密には「単純なものと標準的なレイアウトの両方」ではありません。実際には: PODクラスは、自明なクラスと標準レイアウトクラスの両方であり、非PODクラス(またはその配列)タイプの非静的データメンバーを持たないクラスです。PODタイプは、スカラータイプ、PODクラス、そのようなタイプの配列、またはこれらのタイプのいずれかのcv修飾バージョンです。 言い換えれば、PODタイプは単純で標準的なレイアウトであるだけでなく、再帰的にもそうです。 この再帰的な要件は冗長ですか?言い換えれば、型が自明で標準的なレイアウトでもある場合、それは自動的に再帰的に自明で標準的なレイアウトでもありますか?答えが「いいえ」の場合、PODに失敗した標準レイアウトの自明なタイプの例は何ですか?


2
same_asコンセプトが型の等価性を2回チェックするのはなぜですか?
same_asコンセプトの可能な実装をhttps://en.cppreference.com/w/cpp/concepts/same_asで見ると、何か奇妙なことが起こっていることに気づきました。 namespace detail { template< class T, class U > concept SameHelper = std::is_same_v<T, U>; } template< class T, class U > concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>; 最初の質問は、なぜSameHelperコンセプトが必要なのかということです。二つ目は、なぜあるsame_asかどうかを確認するTと同じであるUとU同じT?冗長ではないですか?
19 c++  c++20  concept 

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
C ++標準がファイルを処理する方法を模索するのはなぜですか?
C ++は、streamoffタイプを使用して(ファイル)ストリーム内のオフセットを表し、[stream.types]で次のように定義されます。 using streamoff = implementation-defined ; タイプstreamoffは、オペレーティングシステムの最大可能ファイルサイズを表すのに十分なサイズの、署名された基本的な整数型の1つの同義語です。287) 287)通常は長いです。 これは、(long32ビット幅しかない可能性があるを使用するのとは対照的に)大きなファイル内をシークできるため、理にかなっています。 [filebuf.virtuals]はbasic_filebuf、ファイル内でシークする関数を次のように定義します。 pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override; off_typestreamoffはと同等です。[iostreams.limits.pos]を参照してください。ただし、標準は、関数の効果を説明し続けます。私は最後の文にイライラしていますfseek。 効果:レッツをwidth示しますa_codecvt.encoding()。is_open() == false、またはの場合、off != 0 && width <= 0位置決め操作は失敗します。それ以外の場合、way != basic_ios::curまたはoff != 0、および最後の操作が出力された場合は、出力シーケンスを更新し、シフト解除シーケンスを書き込みます。次は、新しい位置をシーク:場合はwidth > 0、呼び出しfseek(file, width * off, whence)、そうでない場合は呼び出しますfseek(file, 0, whence)。 fseeklongパラメータを受け入れます。off_typeとstreamoff定義されている場合long long(標準で推奨されているとおり)、これはlong呼び出し時にへのダウンコンバージョンにfseek(file, width * off, …


2
[[no_unique_address]]と同じタイプの2つのメンバー値
で遊ん[[no_unique_address]]でいc++20ます。 cppreferenceの例では、空のタイプEmptyとタイプがありますZ struct Empty {}; // empty class struct Z { char c; [[no_unique_address]] Empty e1, e2; }; どうやら、の大きさはZ、少なくともなければならない2ので、タイプのe1とe2同じです。 しかし、私は本当にZサイズが欲しいです1。これEmptyによりe1、さまざまなタイプのとを適用する追加のテンプレートパラメーターを使用して、いくつかのラッパークラスでラップすることについて考えましたe2。 template <typename T, int i> struct Wrapper : public T{}; struct Z1 { char c; [[no_unique_address]] Wrapper<Empty,1> e1; [[no_unique_address]] Wrapper<Empty,2> e2; }; 残念ながら、sizeof(Z1)==2。サイズをZ11 にするためのコツはありますか? 私はこれをテストしていますgcc version 9.2.1し、clang version 9.0.0 私のアプリケーションでは、フォームの空のタイプがたくさんあります …

1
consteval関数が未定義の動作を許可するのはなぜですか?
C ++には定数式の非常にきちんとした特性があります。それらの評価に未定義の動作を含めることはできません(7.7.4.7): 抽象マシン([intro.execution])の規則に従ってeの評価が次のいずれかを評価しない限り、式eはコア定数式です。 ... このドキュメントの[intro]から[cpp]で指定されている未定義の動作を持つ操作[注:たとえば、符号付き整数オーバーフロー([expr.prop])、特定のポインター演算([expr.add])、ゼロによる除算、または特定のシフト演算—後記]; 値を格納しようとする13!中でconstexpr int実際には、素敵なコンパイルエラーを生成します: constexpr int f(int n) { int r = n--; for (; n > 1; --n) r *= n; return r; } int main() { constexpr int x = f(13); return x; } 出力: 9:19: error: constexpr variable 'x' must be initialized by a …

2
C ++ 20の前にstd :: swapがconstexprとマークされていないのはなぜですか?
C ++ 20ではstd::swap、constexpr関数になります。 標準ライブラリは、マーキングの点constexprで言語に遅れを取っていることを知っていますが、2017年まで<algorithm>に、他の多くのものと同様にconstexprになりました。まだ-ありstd::swapませんでした。そのマーキングを妨げる奇妙な言語の欠陥があったことを漠然と覚えていますが、詳細を忘れています。 誰かがこれを簡潔かつ明確に説明できますか? 動機:C ++ 11 / C ++ 14コードで-のstd::swap()ような関数をマークすることがなぜ悪い考えであるのかを理解する必要がありconstexprます。

2
std :: chrono :: yearsストレージは本当に少なくとも17ビットですか?
cppreferenceから std::chrono::years (since C++20) duration</*signed integer type of at least 17 bits*/, std::ratio<31556952>> を使用libc++すると、16ビットに署名されているstd::chrono::yearsis の下線付きストレージが表示さshortれます。 std::chrono::years( 30797 ) // yields 32767/01/01 std::chrono::years( 30797 ) + 365d // yields -32768/01/01 apparently UB cppreferenceまたは何か他のタイプミスはありますか? 例: #include <fmt/format.h> #include <chrono> template <> struct fmt::formatter<std::chrono::year_month_day> { char presentation = 'F'; constexpr auto parse(format_parse_context& ctx) …
14 c++  chrono  c++20  libc++ 

1
if constexpr-破棄されたステートメントが完全にチェックされるのはなぜですか?
私はGCC 10でc ++ 20 constevalをいじくり回して、このコードを書きました #include <optional> #include <tuple> #include <iostream> template <std::size_t N, typename Predicate, typename Tuple> consteval std::optional<std::size_t> find_if_impl(Predicate&& pred, Tuple&& t) noexcept { constexpr std::size_t I = std::tuple_size_v<std::decay_t<decltype(t)>> - N; if constexpr (N == 0u) { return std::nullopt; } else { return pred(std::get<I>(t)) ? std::make_optional(I) : find_if_impl<N …

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