問題タブ [c++14]
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++ - std::optional から移動する方法
データを解析し、結果を次の関数に渡す次の例を考えてみましょう。
std::optional
では、失敗した解析ステップを処理するためにを使用してコードを変更しましょう。
からの移動は有効ですoptional<T>::value()
か? 大丈夫なら、それstd::optional
も有効ですboost::optional
か?
c++ - constexpr 演算子のオーバーロードを行うためのガイドラインは?
Wrapper
オーバーロードされた乗算operator*=
とを持つ単純な int クラスを考えてみましょうoperator*
。「古いスタイル」の演算子のオーバーロードについてoperator*
は、の観点から定義できます。また、 Boost.Operatorsや@DanielFreyによるその最新の化身df.operators などのoperator*=
ライブラリもあり、ボイラープレートを削減します。
ただし、新しい C++11 を使用したコンパイル時の計算ではconstexpr
、この便利さがなくなります。後者はその (暗黙の) 左引数を変更するため、Aconstexpr operator*
を呼び出すことはできません。operator*=
さらに、constexpr にはオーバーロードがないconstexpr operator*
ため、既存の結果にエクストラを追加するoperator*
と、オーバーロードの解決があいまいになります。
私の現在のアプローチは次のとおりです。
ライブ出力はこちら。これに関する私の問題は次のとおりです。
- の項で表現する代わりに、
operator*=
との両方で乗算ロジックを複製します。operator*
operator*
operator*=
- したがって、Boost.Operators は、他の多くの算術演算子を記述するためのボイラープレートを削減するために機能しなくなりました
質問operator*=
: これは、実行時と混合実行時/コンパイル時の両方を持つ推奨される C++11 の方法constexpr operator*
ですか? C++14 は、たとえばロジックの重複を減らすために、ここで何かを変更しますか?
更新: @AndyProwl による回答は慣用句として受け入れられますが、@DyP の提案によると、C++11 では、余分な割り当てと直感に反するスタイルを犠牲にして、ロジックの重複を減らすことができます
c++ - C++1y モードの Clang >= 3.3 は解析できませんヘッダ
g++ 4.8.1 および c++11 モードの clang >= 3.3 で正しくコンパイルおよび実行されるプロジェクトがあります。ただし、実験-std=c++1y
モードに切り替えると、clang 3.3 (ただし g++ ではない)<cstdio>
は、Boost.Test を介して間接的に含まれるヘッダーをチョークします (そのため、自分で簡単に変更することはできません)。
次のエラー メッセージが表示されます。
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/cstdio:119:11: エラー: グローバルに「gets」という名前のメンバーがありません名前空間
最新の C++ 環境をセットアップする方法に関するこのチュートリアルでは、同様のルックアップの問題が発生max_align_t
します。sed スクリプトを使用して未知のシンボルをマクロで囲むことをお勧めし#ifdef __clang__
ますが、それは脆弱なアプローチのようです。
セットアップ: プレーンな 64 ビット Linux Mint 15 と
g++ (Ubuntu 4.8.1-2ubuntu1~13.04) 4.8.1
Ubuntu clang バージョン 3.3-3~raring1 (branches/release_33) (LLVM 3.3 ベース)
質問:
- このエラーの原因は何ですか? 問題のコードの近くにはどこにもマクロはなく
__clang__
、c++11 モードでの clang はまったく問題ありません。 std
それは言語の問題ですか (C++14 は、C 互換シンボルをグローバルから名前空間にインポートすることについて、C++11 以外のことを言っていますか)?- インクルード パスで何かを変更する必要がありますか? (私は CMake を使用してヘッダー パスを自動的に選択し、CMakeLists.txt 内でモードを切り替えます)
- clang にはこれを解決するためのスイッチがありますか?
c++ - C++11でmake_unique関数を実装するには?
私のコンパイラは make_unique をサポートしていません。どのように書くのですか?