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

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。

3
なぜ配列の次元はその型の一部なのですか?
C ++入門書を読んでいるときに、「配列内の要素の数は配列の型の一部です。」という文に出くわしました。だから私は次のコードを使用して調べたいと思いました: #include<iostream> int main() { char Array1[]{'H', 'e', 'l', 'p'}; char Array2[]{'P', 'l', 'e', 'a', 's', 'e'}; std::cout<<typeid(Array1).name()<<std::endl; //prints A4_c std::cout<<typeid(Array2).name()<<std::endl; //prints A6_c return 0; } 興味深いことに、2つの配列のtypeidの結果は、なんらかの違いがあることを示しています。 舞台裏で何が起こっているのですか? 配列のサイズを含む型を持つ必要があるのはなぜですか?サイズを変えてはいけないというだけのことですか? これは配列の比較にどのように影響しますか? コンセプトを深く理解したいだけ。
14 c++  arrays  c++11 

3
行外のメンバー関数定義にグローバルスコープまでの完全修飾クラス名が必要ですか?
この質問で、クラス外のメンバー関数定義でクラス名(グローバルスコープ演算子を含む)を完全に修飾することが有用/必要であるかどうか疑問に思いました。 一方では、これが以前に行われたのを見たことがありません(適切に行うための構文は不明瞭に思われます)。もう1つは、C ++の名前検索は非常に簡単ではないため、コーナーケースが存在する可能性があります。 質問: クラス外のメンバー関数定義の導入 ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... } が ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }(グローバルスコープ::プレフィックスなし)と異なる場合はありますか? メンバー関数の定義は、クラスを囲む名前空間に配置する必要があるため、これは有効な例ではありません。

3
(++ i)++が有効なのに「++ i ++」が無効なのはなぜですか?
次のコードを考えてみましょう: int main() { int i = 2; int b = ++i++; return 3; } 次のエラーでコンパイルされます。 <source>: In function 'int main()': <source>:3:16: error: lvalue required as increment operand 3 | int b = ++i++; | ^~ これは私には公平に聞こえます。後置インクリメントはコードのように解析されて、接頭増分よりも高い優先度を有するint b = ++(i++);とi右辺値です。したがってエラー。 デフォルトの優先順位を上書きするために、括弧を付けたこのバリアントについて考えてみましょう。 int main() { int i = 2; int b …

2
GCC9はstd :: variantの値のない状態を回避できますか?
私は最近、std::visitコンパイラ間の最適化の素晴らしい比較につながるRedditディスカッションをフォローしました。私は次のことに気づきました:https : //godbolt.org/z/D2Q5ED GCC9とClang9の両方(同じstdlibを共有していると思います)は、すべての型がいくつかの条件を満たす場合に、値のない例外をチェックしてスローするためのコードを生成しません。これはより優れたcodegenにつながるため、MSVC STLで問題を提起し、次のコードが提示されました。 template <class T> struct valueless_hack { struct tag {}; operator T() const { throw tag{}; } }; template<class First, class... Rest> void make_valueless(std::variant<First, Rest...>& v) { try { v.emplace<0>(valueless_hack<First>()); } catch(typename valueless_hack<First>::tag const&) {} } 主張によると、これによりすべてのバリアントが無価値になり、ドキュメントを読むと次のようになります。 まず、現在含まれている値(存在する場合)を破棄します。次にT_I、引数を使用してtypeの値を作成する場合と同様に、含まれている値を直接初期化します。std::forward<Args>(args)....例外がスローされた場合、*thisvalueless_by_exceptionになることがあります。 わからないこと:なぜ「かもしれない」と記載されているのですか?操作全体がスローされた場合、古い状態を維持することは合法ですか?これはGCCが行うことなので、 // For suitably-small, trivially copyable types we …

1
std :: swapがClang / Winのvector <bool>要素で機能しないのはなぜですか?
私はこのようなコードを持っています: #include &lt;vector&gt; #include &lt;utility&gt; int main() { std::vector&lt;bool&gt; vb{true, false}; std::swap(vb[0], vb[1]); } vector&lt;bool&gt;脇見の健全性についての議論は、これはうまく機能していました: Mac用のClang Visual Studio for Windows Linux用GCC 次に、WindowsでClangを使用してビルドしようとすると、次のエラー(要約)が表示されました。 error: no matching function for call to 'swap' std::swap(vb[0], vb[1]); ^~~~~~~~~ note: candidate function [with _Ty = std::_Vb_reference&lt;std::_Wrap_alloc&lt;std::allocator&lt;unsigned int&gt; &gt; &gt;, $1 = void] not viable: expects an …

2
オブジェクトが整数であるかどうか、またはクラス型であるかどうかを知る上でのポイントは何ですか?
こんにちは私はCppreference.comでこのような多くの例を見てきました: std::is_class&lt;T&gt; std::is_integral 等々。たとえば、trueまたはを取得してコードを実行するかどうかを知っていますfalse。しかし、その意味は何ですか?たとえば、オブジェクトがクラス型であるかどうかを知っていますか? #include &lt;iostream&gt; #include &lt;type_traits&gt; struct A {}; class B {}; enum class C {}; int main() { std::cout &lt;&lt; std::boolalpha; std::cout &lt;&lt; std::is_class&lt;A&gt;::value &lt;&lt; '\n'; std::cout &lt;&lt; std::is_class&lt;B&gt;::value &lt;&lt; '\n'; std::cout &lt;&lt; std::is_class&lt;C&gt;::value &lt;&lt; '\n'; std::cout &lt;&lt; std::is_class&lt;int&gt;::value &lt;&lt; '\n'; } 出力: true true false false …
14 c++  templates 

1
std :: vector範囲コンストラクターは明示的な変換を呼び出すことができますか?
次のプログラムは整形式ですか? #include &lt;vector&gt; struct A { explicit A(int) {} }; int main() { std::vector&lt;int&gt; vi = {1, 2, 3, 4, 5}; std::vector&lt;A&gt; va(vi.begin(), vi.end()); } C ++ 17 [sequence.reqmts]によると、 X u(i, j); どこXシーケンスコンテナは、されています。 TでなければならEmplaceConstructibleにXから*i。 ただし、前の段落では、次のように述べられています。 iそして、j表すイテレータは入力イテレータの要件を満たすとに暗黙的に変換要素を指しvalue_type、 したがって、両方の要件が満たされる必要があるように思えます:範囲の値の型は、コンテナーの値の型に暗黙的に変換可能で EmplaceConstructibleなければならず、満たす必要があります(つまり、アロケーターは必要な初期化を実行できる必要があります) 。以来intに暗黙的に変換できませんA、このプログラムは、病気に形成されなければなりません。 ただし、驚くべきことに、GCCでコンパイルされているようです。
14 c++  c++17 

3
ラムダ関数をオーバーロードする
単純なローカルラムダ関数をオーバーロードする方法は? 元の問題のSSE: #include &lt;iostream&gt; #include &lt;map&gt; void read() { static std::string line; std::getline(std::cin, line); auto translate = [](int idx) { constexpr static int table[8]{ 7,6,5,4,3,2,1,0 }; return table[idx]; }; auto translate = [](char c) { std::map&lt;char, int&gt; table{ {'a', 0}, {'b', 1}, {'c', 2}, {'d', 3}, {'e', 4}, {'f', 5}, …

3
テンプレート関数がconst refを取得するメンバーへのポインター関数に対して機能しない
最近、私はいくつかのコードの繰り返しを解決するためにテンプレート関数を書きました。次のようになります。 template&lt;class T, class R, class... Args&gt; R call_or_throw(const std::weak_ptr&lt;T&gt;&amp; ptr, const std::string&amp; error, R (T::*fun)(Args...), Args... args) { if (auto sp = ptr.lock()) { return std::invoke(fun, *sp, args...); } else { throw std::runtime_error(error.c_str()); } } int main() { auto a = std::make_shared&lt;A&gt;(); call_or_throw(std::weak_ptr&lt;A&gt;(a), "err", &amp;A::foo, 1); } このコードはclass A、次のように完全に機能します。 …
14 c++  templates 

3
std :: arrayを使用したstd :: bit_cast
彼の最近の講演で、「++現代Cでタイプpunning」ティムールDoumlerは言ったそのstd::bit_castビットを鋳造するために使用することはできませんfloatにunsigned char[4] Cスタイルの配列を関数から返すことができないため。のstd::memcpyようなものreinterpret_cast&lt;unsigned char*&gt;(&amp;f)[i]が明確になるときは、C ++ 23(以降)を使用するか待つ必要があります。 C ++ 20では、std::arraywith std::bit_cast、 float f = /* some value */; auto bits = std::bit_cast&lt;std::array&lt;unsigned char, sizeof(float)&gt;&gt;(f); Cスタイルの配列の代わりにfloat?

3
リストの初期化をコピーしますか?なぜこれがコンパイルされるのですか?
Microsoft Visual Studio Community 2019、V16.5.2を使用しています。リストの初期化をテストしたい 次のテストプログラムをご覧ください。 #include &lt;string&gt; void foo(std::string str) {} int main() { foo( {"str1", "str2"} ); return 0; } これはエラーや警告なしでコンパイルされます。どうして? 実行時エラーが発生します。 Expression: Transposed pointer range 誰かがここで何が起こっているのか説明できますか? 編集。 コードを逆アセンブルしてデバッガで実行しました foo( {"str1", "str2"} ); 00F739A8 sub esp,1Ch 00F739AB mov esi,esp 00F739AD mov dword ptr [ebp-0C8h],esp 00F739B3 lea ecx,[ebp-0D1h] 00F739B9 …
13 c++ 

1
C ++ nullptr実装はどのように機能しますか?
仕組みを知りたいnullptrです。規格N4659およびN4849は次のように述べています。 タイプが必要std::nullptr_tです。 そのアドレスを取ることはできません。 これは、ポインターおよびメンバーへのポインターに直接変換できます。 sizeof(std::nullptr_t) == sizeof(void*); への変換boolはfalseです。 その値は、と同じように整数型に変換できます(void*)0が、逆方向には変換できません。 したがって、基本的にはと同じ意味を持つ定数ですが、(void*)0型が異なります。std::nullptr_t私のデバイスでの実装を見つけました。それは次のとおりです。 #ifdef _LIBCPP_HAS_NO_NULLPTR _LIBCPP_BEGIN_NAMESPACE_STD struct _LIBCPP_TEMPLATE_VIS nullptr_t { void* __lx; struct __nat {int __for_bool_;}; _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR nullptr_t() : __lx(0) {} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR nullptr_t(int __nat::*) : __lx(0) {} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator int __nat::*() const {return 0;} template &lt;class _Tp&gt; _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator …

1
std :: is_constructibleがプライベートコンストラクターに矛盾した値を返す
std::is_constructibleがプライベートコンストラクターを処理するルールは何ですか?次のコードがあるとします: #include &lt;iostream&gt; class Class { private: Class() { } }; template &lt;typename T&gt; class Test { public: static void test() { std::cout //&lt;&lt; std::is_constructible&lt;Class&gt;::value &lt;&lt; std::is_constructible&lt;T&gt;::value &lt;&lt; std::endl; } }; int main() { Test&lt;Class&gt;::test(); } これは0(ideone)を出力しTます。つまり、デフォルトでは構築できません。 コメント行のコメントを外すと、出力されます11(ideone)。そのため、突然Tデフォルトで構築可能になりました。 私は両方の結果をサポートする理由を見つけることができましたが、コメント行を含めると2番目の結果がどのように変わるかわかりません。これはどういうわけかUBを呼び出していますか?これはコンパイラのバグですか?それともstd::is_constructible本当に矛盾していますか?
13 c++  typetraits 

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

1
テンプレートクラスの構造体でのC ++コンパイラの問題
次のコードは、gccまたはclangでコンパイルできません。 template&lt;class T&gt; class foo{}; template&lt;class T&gt; class template_class_with_struct { void my_method() { if(this-&gt;b.foo &lt; 1); }; struct bar { long foo; } b; }; エラーメッセージは error: type/value mismatch at argument 1 in template parameter list for 'template&lt;class T&gt; class foo' 8 | if(this-&gt;b.foo &lt; 1); エラーはtemplatクラスfooが原因で発生します。&lt;1の代わりに&lt;=を書き込むと、コンパイルも行われます。 ヒントはありますか? CompilerExplorerリンクhttps://godbolt.org/z/v6Tygo

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