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

このタグは、C ++ 11としてコンパイルする必要があるコードに使用します(C ++ 14以降で導入された機能は使用しません)。

1
MSVCのコンパイラのバグの可能性
次のコードは、gccとclang(および他の多くのC ++ 11コンパイラ)でコンパイルされます。 #include <stdint.h> typedef int datatype; template <typename T> struct to_datatype {}; template <> struct to_datatype<int16_t> { static constexpr datatype value = 1; }; template <typename T> class data { public: data(datatype dt = to_datatype<T>::value) {} }; int main() { data<char> d{to_datatype<int16_t>::value}; } (ほぼ)最新のMSVCでコンパイルする場合 > cl .\test.cpp /std:c++latest …
13 c++  c++11  visual-c++ 

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 

2
ここで列挙型変数が右辺値になるのはなぜですか?
例: typedef enum Color { RED, GREEN, BLUE } Color; void func(unsigned int& num) { num++; } int main() { Color clr = RED; func(clr); return 0; } これをコンパイルすると、次のエラーが発生します。 <source>: In function 'int main()': <source>:16:9: error: cannot bind non-const lvalue reference of type 'unsigned int&' to an rvalue of type …

3
C ++でのstd :: resize(n)とstd :: shrink_to_fitの違いは?
私はこれらの声明に出くわしました: resize(n)–「n」要素が含まれるようにコンテナのサイズを変更します。 shrink_to_fit()–サイズに合わせてコンテナの容量を減らし、容量を超えるすべての要素を破棄します。 これらの機能に大きな違いはありますか?彼らはc ++のベクトルの下に来る

3
コンパイラが生成した関数を見つける方法は?
コンパイラが生成した関数、3つのルールと5つのルールについて知っています。実際のシナリオでは、コンパイラによって生成された関数(コンストラクタ、代入演算子、デストラクタ)のどれが実際にコンパイラによって作成されたかを正確に把握するのは簡単なことではありません。 特定のクラスのコンパイラー生成関数をリストする方法はありますか? 私は主にVisual Studio 2019とXcodeに興味がありますが、一般的なソリューションがさらに歓迎されます。
11 c++  c++11 

5
ラムダのC ++三項割り当て
次のスニペットがコンパイルされない理由は何ですか?「エラー:オペランドの?:タイプが異なります」というエラーが表示されます。 auto lambda1 = [&](T& arg) { ... }; auto lambda2 = [&](T& arg) { ... }; auto lambda = condition ? lambda1 : lambda2;


2
戻り値の型を明示的に述べているにもかかわらず、ラムダの呼び出しがあいまいです
オーバーロードされた関数は、ラムダのタイプが決定可能であることを前提に、両方のファンクターを取り込む必要があります(キャスト可能(std::function私が間違っている場合は修正してください)。定義されていますか?([&]() -> Type {}) 現在のソリューションでは、参照によるキャプチャが必要なため、コードにそのロジックが含まれていることに注意してください。 次の例は、問題について説明しています。 #include <iostream> #include <string> #include <functional> void do_some(std::function<void(int)> thing) { thing(5); } void do_some(std::function<bool(int)> thing) { if (thing(10)) { std::cout << "it's true!" << std::endl; } } int main() { int local_to_be_modified = 0; do_some( [&](int in) { local_to_be_modified = in; std::cout << "This …

2
C ++テンプレートテンプレート引数タイプの控除
文字列のコンテナを調べて、パターンの一致を見つけて出力するコードがあります。テンプレート化された関数fooで印刷が実行されます コード #include <iostream> #include <algorithm> #include <iterator> #include <vector> #include <string> #include <tuple> #include <utility> template<typename Iterator, template<typename> class Container> void foo(Iterator first, Container<std::pair<Iterator, Iterator>> const &findings) { for (auto const &finding : findings) { std::cout << "pos = " << std::distance(first, finding.first) << " "; std::copy(finding.first, finding.second, std::ostream_iterator<char>(std::cout)); …

3
nullptrをuintptr_tに変換できますか?異なるコンパイラは同意しません
このプログラムを考えてみましょう: #include <cstdint> using my_time_t = uintptr_t; int main() { const my_time_t t = my_time_t(nullptr); } msvc v19.24でコンパイルできませんでした: <source>(5): error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'my_time_t' <source>(5): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type <source>(5): error C2789: 't': …
10 c++  c++11  gcc  visual-c++  clang 

3
次の場合に依存型にtypenameを使用する必要がないのはなぜですか?
型の参照の削除については、ここで読んでいます。 次の例を示します。 #include <iostream> // std::cout #include <type_traits> // std::is_same template<class T1, class T2> void print_is_same() { std::cout << std::is_same<T1, T2>() << '\n'; } int main() { std::cout << std::boolalpha; print_is_same<int, int>(); print_is_same<int, int &>(); print_is_same<int, int &&>(); print_is_same<int, std::remove_reference<int>::type>(); // Why not typename std::remove_reference<int>::type ? print_is_same<int, std::remove_reference<int &>::type>();// Why …

1
インスタンスを作成せずにstd :: array <T、N>の要素数を取得する方法は?
はありますがstd::array&lt;T, N&gt;::size()、静的ではないため、のインスタンスが必要ですstd::array。配列のインスタンスを作成せずに、それが返す値(Nのstd::array&lt;T, N&gt;)を取得する方法はありますか?通常の配列では、を使用することもできましたがsizeof、sizeof(std::array&lt;T, N&gt;) == N * sizeof(T)本当であるという保証はありません。
9 c++  arrays  c++11  sizeof 

2
スレッドセーフルールによって提案された非const引数を使用してコンストラクターをコピーしますか?
レガシーコードの一部のラッパーがあります。 class A{ L* impl_; // the legacy object has to be in the heap, could be also unique_ptr A(A const&amp;) = delete; L* duplicate(){L* ret; legacy_duplicate(impl_, &amp;L); return ret;} ... // proper resource management here }; このレガシーコードでは、オブジェクトを「複製」する関数はスレッドセーフではない(同じ最初の引数を呼び出す場合)ためconst、ラッパーでマークされていません。私は現代のルールに従っていると思います:https : //herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/ これduplicateは、そうではない詳細を除いて、コピーコンストラクタを実装する良い方法のように見えconstます。したがって、これを直接行うことはできません。 class A{ L* impl_; // the legacy object has …

2
安全な暗号化キーのstd :: arrayにカスタムアロケーターを使用できますか?
私std::arrayは完全にスタックに割り当てられていることを知っていますが、この質問は2つのことを必要とするセキュリティの懸念によって動機付けられています: のデータはstd::array破棄時にゼロ化またはランダム化されます のデータはロックstd::arrayされるため、クラッシュやスワップメモリ​​のいずれでもディスクに移動することはありません 通常、でstd::vectorの解決策は、これらのことを行うカスタムアロケータを作成することです。ただし、の場合std::array、これを行う方法がわからないため、この質問についてもわかりません。 私ができる最善のことはこれです: template &lt;typename T, std::size_t Size&gt; struct SecureArray : public std::array&lt;T, Size&gt; { static_assert(std::is_pod&lt;T&gt;::value, "Only POD types allowed") static_assert(sizeof(T) == 1, "Only 1-byte types allowed") virtual ~SecureArray() { std::vector&lt;uint8_t&gt; d = RandomBytes(Size); // generates Size random bytes std::memcpy(this-&gt;data(), d.data(), Size); } } ただし、これには明らかにメモリロックが欠けstd::arrayてstd::arrayおり、そもそも使用することで得られるパフォーマンススキームが複雑になります。 より良い解決策はありますか?

3
enable_shared_from_thisを最初の基本クラスにする必要がありますか?
私のクラスは複数のベースから継承していますが、そのうちの1つはですstd::enable_shared_from_this。一塁でなければならないのですか? 次のコード例を考えてみます。 struct A { ~A(); }; struct B { ~B(); }; struct C : A, B, std::enable_shared_from_this&lt;C&gt; {}; std::make_shared&lt;C&gt;(); 実行する~A()と~B()、C住んでいたストレージがまだ存在していることを確認できますか?

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