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

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

2
C ++ 17でファイルサイズをバイト単位で取得する方法
特定のオペレーティングシステムの落とし穴はありますか。 そこに多くの重複(ある1、2、3、4、5、この質問のは)しかし、彼らは数十年前に答えました。これらの質問の多くで投票数が非常に多い回答は、今日間違っています。 .sxでの他の(古いQAの)メソッド stat.h(ラッパーsprintstatf)、syscallを使用 tellg()は、定義ごとに位置を返しますが、必ずしもバイトではありません。戻り値の型はではありませんint。

6
C ++ 17でstd :: make_uniqueを使用する理由
私が理解している限りでは、C ++ 14が導入さstd::make_uniqueれたのは、パラメーターの評価順序が指定されなかった結果、これが安全ではなかったためです。 f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A (説明:評価が最初にrawポインターにメモリを割り当て、次に呼び出しをg()行い、std::unique_ptr構築前に例外がスローされた場合、メモリがリークします。) 呼び出しstd::make_uniqueは呼び出し順序を制限する方法であり、これにより物事が安全になります。 f(std::make_unique<MyClass>(param), g()); // Syntax B それ以来、C ++ 17があまりにも構文Aの安全を作り、評価順序を明らかにしたので、ここで私の質問です:まだ使用する理由であるstd::make_unique以上std::unique_ptrの++ 17 Cでコンストラクタを?いくつか例を挙げていただけますか? 今のところ、私が想像できる唯一の理由は、それがMyClass一度だけタイプできることです(あなたがでポリモーフィズムに依存する必要がないと仮定するとstd::unique_ptr<Base>(new Derived(param)))。しかし、それはかなり弱い理由のようです、特にstd::make_uniqueがstd::unique_ptrコンストラクターを使用している削除者を指定できないです。 そして明確にするために、私はstd::make_unique標準ライブラリから削除することを支持することはしません(少なくとも後方互換性のためにそれを維持することは推奨しません)。std::unique_ptr
96 c++  c++17  unique-ptr 


4
試験的::ファイルシステムのリンカーエラー
新しいc ++ 1z機能を実際にgcc 6.0内の開発の先頭で使用しようとしています。 この小さな例を試してみると: #include <iostream> #include <experimental/filesystem> namespace fs = std::experimental::filesystem; int main() { fs::path p1 = "/home/pete/checkit"; std::cout << "p1 = " << p1 << std::endl; } 私が得た: / opt / linux-gnu_6-20151011 / bin / g ++ --std = c ++ 1z main.cpp -O2 -g -o go …
94 c++  gcc  c++17 

3
C ++では、型情報はいつ逆方向に流れますか?
私はちょうどでステファンT. Lavavejトークを見CppCon 2018に「クラステンプレート引数控除」、上のいくつかの点彼はついでに言います: C ++の型情報は、逆方向に流れることはほとんどありません... 1つまたは2つのケースがあるため、「ほとんど」と言わざるを得ませんでした。 彼がどのケースを参照しているのかを理解しようとしたにもかかわらず、私は何も思いつきませんでした。したがって、質問: C ++ 17標準では、その型情報が逆伝播するように義務付けられているのはどの場合ですか?

1
保証されたコピーの省略はどのように機能しますか?
2016年のOuluISO C ++標準会議で、標準化委員会によって、簡略化された値のカテゴリによる保証されたコピーの省略と呼ばれる提案がC ++ 17に投票されました。 保証されたコピーの省略はどの程度正確に機能しますか?コピーの省略がすでに許可されているいくつかのケースをカバーしていますか、それともコピーの省略を保証するためにコードの変更が必要ですか?

4
最新のC ++の実験的な機能は、長期的なプロジェクトに対して信頼できますか?
現在C ++ 11/14を使用しているプロジェクトがstd::filesystemありますが、C ++ 17でのみ使用可能なのようなものが必要であるため、現在使用する機会がありません。ただし、現在のコンパイラではstd::experimental::filesystem。として使用できるようです。将来、次のようなものを追加できると仮定して、実験的な機能を使用することをお勧めしますか? #ifdef CXX17 //if this is C++17 std::filesystem::something ...; #else std::experimental::filesystem::something ...; #endif 私の懸念は次のとおりです。 1.すべての準拠コンパイラが同じ実験機能を備えていることが保証されていますか? 2.実験的な機能は、信頼性を低下させる大きな変更が発生する傾向がありますか? たぶん、疑問に思うことがもっとあります。なぜそれらを使用する必要があるのですか、または使用しないのですか?私は新しいプロジェクトに戸惑い、何を決めるのかわかりません。

1
テンプレート演繹ガイドとは何ですか?いつ使用する必要がありますか?
C ++ 17標準では、「テンプレート演繹ガイド」が導入されています。これらは、このバージョンの標準で導入されたコンストラクターの新しいテンプレート引数の推論と関係があると思いますが、それらが何であり、何のためにあるのかについての簡単なFAQスタイルの説明はまだ見ていません。 C ++ 17のテンプレート控除ガイドとは何ですか? なぜ(そしていつ)それらが必要なのですか? どうすれば宣言できますか?

2
std ::構造化バインディングを無視しますか?
前奏曲: std::tuple<int, int, int> f(); std::tuple<int, int, float, int> g(); C ++ 1zでは、構造化バインディングの構文が導入され、代わりに書き込みが可能になります。 int a, b, c; std::tie(a, b, c) = f(); 何かのようなもの auto [a, b, c] = f(); ただし、特定のコンポーネントを無視するようstd::tieに指定std::ignoreすることもできます。例: std::tie(a, b, std::ignore, c) = g(); 新しい構造化バインディング構文を使用して同様のことを行うことは可能ですか?それはどのように機能しますか?

1
[[fallthrough]]を使用しても、GCCがフォールスルーについて警告するのはなぜですか?
次のコードでは[[fallthrough]]、C ++ 1zの標準属性を使用して、フォールスルーが必要であることを文書化します。 #include <iostream> int main() { switch (0) { case 0: std::cout << "a\n"; [[fallthrough]] case 1: std::cout << "b\n"; break; } } GCC 7.1では、コードはエラーなしでコンパイルされます。ただし、コンパイラはフォールスルーについて警告します。 warning: this statement may fall through [-Wimplicit-fallthrough=] std::cout << "a\n"; ~~~~~~~~~~^~~~~~~~ どうして?

3
C ++ 17以降、正しいアドレスとタイプのポインターは常に有効なポインターですか?
(この質問と回答を参照してください。) C ++ 17標準の前は、次の文が[basic.compound] / 3に含まれていました。 タイプTのオブジェクトがアドレスAにある場合、値がアドレスAであるタイプcv T *のポインターは、値の取得方法に関係なく、そのオブジェクトを指していると言われます。 しかし、C ++ 17以降、この文は削除されました。 たとえば、この文によってこのサンプルコードが定義され、C ++ 17以降は未定義の動作であると思います。 alignas(int) unsigned char buffer[2*sizeof(int)]; auto p1=new(buffer) int{}; auto p2=new(p1+1) int{}; *(p1+1)=10; C ++ 17より前p1+1は、へのアドレスを保持し*p2、正しい型を持っているので*(p1+1)、へのポインタもそうです*p2。C ++で17p1+1ある過去エンドポインタになっていないので、オブジェクトへのポインタと、私はそれがdereferencableではないと信じています。 この標準的な権利の変更の解釈ですか、それとも引用された文の削除を補償する他の規則がありますか?

6
「if」ステートメントで変数を初期化する
C ++ 17では、次のifようなステートメントで変数を初期化できることを読みました if (int length = 2; length == 2) //execute something の代わりに int length = 2; if (length == 2) //do something 短いですが、コードの可読性に影響します(特に、この新機能を知らない人にとって)。これは、大規模なソフトウェア開発では悪いコーディング方法だと思います。 コードを短くする以外に、この機能を使用する利点はありますか?
80 c++  c++17 

5
ラムダ自体内のC ++ラムダ関数のアドレスを取得するにはどうすればよいですか?
それ自体の中でラムダ関数のアドレスを取得する方法を理解しようとしています。これがサンプルコードです: []() { std::cout << "Address of this lambda function is => " << ???? }(); ラムダを変数にキャプチャしてアドレスを出力できることはわかっていますが、この無名関数が実行されているときにそれを実行したいと考えています。 これを行う簡単な方法はありますか?
53 c++  c++11  lambda  c++14  c++17 

2
関数でremove_referenceが機能しないのはなぜですか?
先日、テンプレートのメタプログラミングを行っているときに、奇妙なことに遭遇しました。それは基本的にこの主張に帰着します(私が期待するとおり)通過しません。 static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>); 最初は、関数参照を定義する構文上の間違いを犯していると思っていましたが、このアサーションは成功し、そうではないことがわかりました。 static_assert(std::is_same_v<void()&, void()&>); またremove_reference、cppreferenceからソースをコピーして自分で実装しようとしましたが、それも機能しませんでした。ここで何が起こっているのですか?
38 c++  templates  types  c++17 


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