ezoeryou / cpp17book Goto Github PK
View Code? Open in Web Editor NEWtextbook for C++17
License: Other
textbook for C++17
License: Other
039-cpp17-lib-variant.md の「型非安全な古典的union」において「sizeof(U)のサイズ」「sizeof(S)のサイズ」と書いてありますが、これは「sizeof(U)の値」ないし「Uのサイズ」などとすべきではないでしょうか。
尚、検索したところ、この箇所以外では地の文で sizeof が使われているところは無かったです。
今までintegral_constantを使っていた場面で特にboolだけが必要な場面では、C++17以降は単にstd::true_typeかstd::false_typeと書くだけでよくなる。
とありますが、std::true_type
とstd::false_type
自体はC++11から存在したはずなので(N3337 20.9.3)、ここは「std::bool_constant</* value */>
と書くだけでよくなる」ではないでしょうか。
073-cpp17-lib-filesystem.md において、「path : ファイルパス文字列クラス」の
例えばPOSIX互換環境では/が用いられるが、Microsoft Windowsでは\が使われている。
と
例えば、Microsoft Windowsでは、ネイティブのファイルパス文字列はディレクトリーの区切り文字にPOSIX準拠の/ではなく\を使っている。
および「resize」の
増えたデータはnullバイト''でパディングされる。
という3箇所の文においてバックスラッシュが出てきています。これは GFM ではそのまま問題なく表示されていますが、pandoc に通すとエスケープだと判断されてしまい、バックスラッシュ以降の文章が消えてしまっています (参考)。
\\
とバックスラッシュ自体をエスケープすれば HTML 上は意図通り表示されるようになります。
GitHub 上で .md ファイルを閲覧した場合もちゃんとエスケープが認識されて表示されるようです (参考: 修正を施したブランチ)。
提案: 地の文の生のバックスラッシュをエスケープするのは如何でしょうか?
boyer_moore_horspool_searcherの節で
使い方はboyer_moore_horspool_searcherと変わらない。
と自己言及になっています。
前の節に出てきているboyer_moore_searcherを使った
「使い方はboyer_moore_searcherと変わらない」ではないでしょうか。
#include <type_traits>
int main()
{
static_assert(true ==std::bool_constant<[](){ return true; }()>{});
}
これは違法だが、「コンパイル時定数を必要とする場所で使うことができる」と書いていると使えるのではないかと思ってしまう。
std::basic_ofstream<path::value_type> file( name )
basic_ofstream
の型パラメーターはファイル名と関係ないので、型パラメーターにpath::value_type
を渡すのはおかしくないですか?
C++17で型パラメーターとは無関係にconst path&
とconst path::value_type*
を引数に取るオーバーロードが追加されたので、普通に
std::ofstream file( path )
か
std::ofstream file( name )
と書けばいいと思っていたのですが、何か勘違いしているでしょうか。
std::byteのサンプルコード中に、次の1行があります:
b = static_cast< std::byte >( 0b11110000 ) ; // アルファベットの'l'
このコメントを見て2つの解釈が浮かびましたが、どちらも違いました。
このコメントはどういった意味でしょうか?
027-cpp17-core-evaluation-order.md において「a, b, c, dの順番に評価される」と書いてある下のコードブロックには変数 c, d がありません。間違いとは言い切れませんが、奇妙です。
また、この節の最終行付近に
関数呼び出しの実引数のオペランドb1, b2, b3の評価順序は未規定のままだ。
これにより、既存の未定義の挙動となっていたコードの挙動が定まる。
と書かれていますが、「未定義の挙動」は Undefined Behavior と紛らわしいため、上の行と言葉を揃えて「未規定の挙動」とするのは如何でしょうか。
https://github.com/EzoeRyou/cpp17book/blob/master/042-cpp17-lib-string-view.md#L48-L75
このサンプルではstring_typeを定義してますがprocess_stringでの使用例が無いです.
念の為の確認です。004-cpp14-core-digit-separator.md において
数値区切りを使うと、100'000'000と1000'000'000のように書くことができる。これはわかりやすい。
とありますが、ここは 1'000'000'000
ではなくて 1000'000'000
なのでしょうか。
使い所として以下の例が提示されていますが、
if ( auto ptr = std::make_unique<int>(42) ; ptr )
{
// 処理
}
これは以下の点が気になります。
if ( auto ptr = std::make_unique<int>(42) )
{
// 処理
}
std::make_unique<int>(42)
は例外を投げるか、bool
にキャストして true
になるかのどちらかしかない気がします。だとすると、条件分岐の意義がないように思われること。この新しい構文は、宣言される変数と実際に条件分岐に使われる式が異なる場合に力を発揮するので、例えば以下のような感じの例にするのはいかがでしょう。
if ( auto ptr = do_something(); *ptr )
{
// 処理
}
標準ライブラリのメモリーリソースのサンプルで定義しているmemory_allocator中で、do_allocateを2回オーバーライドしています。
virtual void *
do_allocate( std::size_t bytes, std::size_t alignment ) override
{
std::scoped_lock lock( m ) ;
// リンクリストをたどり、十分な大きさの未使用領域を探し、リンクリスト構造体を構築して返す
// アライメント要求に注意
}
virtual void *
do_allocate( std::size_t bytes, std::size_t alignment ) override
{
std::scoped_lock lock( m ) ;
// リンクリストから該当する部分を削除
}
後者はdo_deallocateのオーバーライドではないでしょうか。
関数型としての例外指定 において、noexcept を表すのに「例外指定」と「無例外指定」という 2 つの表記が混在しているように見受けられる。どちらかに統一するべきではないか。
028 constexpr if の「constexpr ifでは解決できない問題」にあるソースコードは「実行時の条件分岐」にあるソースコードと全く一緒です。constexpr
の入れ忘れではないでしょうか。つまり、以下のようなコードなのではないでしょうか。
// do_true_thingの宣言
void do_true_thing() ;
// do_false_thingの宣言は存在しない
void f( bool runtime_value )
{
if constexpr ( true )
do_true_thing() ;
else
do_false_thing() ; // エラー
}
#88 に関連して。
@=
という演算子が出現しますが、これは +=
や *=
のことを指しているんですよね?
初見ではこれが何を指しているのか分からず、私は @=
という演算子が本当にあるのだと思って読んでました。一言、これが何を指しているのか説明があると親切だと思うのですが、どうでしょうか?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.