GithubHelp home page GithubHelp logo

cpp17book's Issues

043 memory_allocatorがdo_allocateを2回オーバーライド

標準ライブラリのメモリーリソースのサンプルで定義している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のオーバーライドではないでしょうか。

「sizeof(U)のサイズ」は重言

039-cpp17-lib-variant.md の「型非安全な古典的union」において「sizeof(U)のサイズ」「sizeof(S)のサイズ」と書いてありますが、これは「sizeof(U)の値」ないし「Uのサイズ」などとすべきではないでしょうか。

尚、検索したところ、この箇所以外では地の文で sizeof が使われているところは無かったです。

constexprラムダ式がtemplate中で使えないことを軽く触れておくべきではないか?

https://github.com/EzoeRyou/cpp17book/blob/fe9ecd31cf918de9a91de74bd02f0f61b6a15353/021-cpp17-core-constexpr-lambda.md

#include <type_traits>

int main()
{
    static_assert(true ==std::bool_constant<[](){ return true; }()>{});
}

これは違法だが、「コンパイル時定数を必要とする場所で使うことができる」と書いていると使えるのではないかと思ってしまう。

bool_constant: std::(true|false)_typeはC++11から

060-bool-constantで、

今までintegral_constantを使っていた場面で特にboolだけが必要な場面では、C++17以降は単にstd::true_typeかstd::false_typeと書くだけでよくなる。

とありますが、std::true_typestd::false_type自体はC++11から存在したはずなので(N3337 20.9.3)、ここは「std::bool_constant</* value */>と書くだけでよくなる」ではないでしょうか。

027 @= が何を指しているのか分からない

#88 に関連して。

@= という演算子が出現しますが、これは +=*= のことを指しているんですよね?
初見ではこれが何を指しているのか分からず、私は @= という演算子が本当にあるのだと思って読んでました。一言、これが何を指しているのか説明があると親切だと思うのですが、どうでしょうか?

バックスラッシュのエスケープ

073-cpp17-lib-filesystem.md において、「path : ファイルパス文字列クラス」

例えばPOSIX互換環境では/が用いられるが、Microsoft Windowsでは\が使われている。

例えば、Microsoft Windowsでは、ネイティブのファイルパス文字列はディレクトリーの区切り文字にPOSIX準拠の/ではなく\を使っている。

および「resize」

増えたデータはnullバイト''でパディングされる。

という3箇所の文においてバックスラッシュが出てきています。これは GFM ではそのまま問題なく表示されていますが、pandoc に通すとエスケープだと判断されてしまい、バックスラッシュ以降の文章が消えてしまっています (参考)。

\\ とバックスラッシュ自体をエスケープすれば HTML 上は意図通り表示されるようになります。
GitHub 上で .md ファイルを閲覧した場合もちゃんとエスケープが認識されて表示されるようです (参考: 修正を施したブランチ)。

提案: 地の文の生のバックスラッシュをエスケープするのは如何でしょうか?

pathのoperator string_type()に関する例がおかしい

    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 ) 

と書けばいいと思っていたのですが、何か勘違いしているでしょうか。

027 @= は複合代入演算子だけでなく単純代入演算子も含む?

#114 のFixとして@=の説明が入りましたが、現状の文章では複合代入演算子のみ指しているように思います:

@=の@には文法上許される任意の演算子が入る(+=, -=など)

一方でP0145R3を読むと次の記述があり、単純代入演算子(simple assignment)も含まれているように思います:

Assignment expressions are evaluated from right to left. This includes compound assignments.

@=の説明を、「@=は単純代入演算子か、+=などの複合代入演算子を指す」とするのはどうでしょうか?

027 オペランドの評価順序: 言葉遣いの修正

027-cpp17-core-evaluation-order.md において「a, b, c, dの順番に評価される」と書いてある下のコードブロックには変数 c, d がありません。間違いとは言い切れませんが、奇妙です。

また、この節の最終行付近に

関数呼び出しの実引数のオペランドb1, b2, b3の評価順序は未規定のままだ。
これにより、既存の未定義の挙動となっていたコードの挙動が定まる。

と書かれていますが、「未定義の挙動」は Undefined Behavior と紛らわしいため、上の行と言葉を揃えて「未規定の挙動」とするのは如何でしょうか。

029 「初期化文つき条件文」のコード例

使い所として以下の例が提示されていますが、

if ( auto ptr = std::make_unique<int>(42) ; ptr )
{
    // 処理
}

これは以下の点が気になります。

  1. 従来の C++ でも以下のようにすればできるということ、
if ( auto ptr = std::make_unique<int>(42) )
{
    // 処理
}
  1. std::make_unique<int>(42) は例外を投げるか、bool にキャストして true になるかのどちらかしかない気がします。だとすると、条件分岐の意義がないように思われること。

この新しい構文は、宣言される変数と実際に条件分岐に使われる式が異なる場合に力を発揮するので、例えば以下のような感じの例にするのはいかがでしょう。

if ( auto ptr = do_something(); *ptr )
{
    // 処理
}

028 constexpr if: ソースコードにtypoがある?

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() ; // エラー
}

上記コードの Wandbox

037 std::byteのサンプルコード中の「アルファベットの'l'」コメントが分からない

std::byteのサンプルコード中に、次の1行があります:

b = static_cast< std::byte >( 0b11110000 ) ; // アルファベットの'l'

このコメントを見て2つの解釈が浮かびましたが、どちらも違いました。

  1. リテラル中にアルファベットの'l'が現れていることの注意喚起?→数字の'1'と'0'だけが現れているので違う
  2. 0b11110000の値がアルファベットの'l'を指している?→'l'のASCIIコード値は0x6Cなので違う

このコメントはどういった意味でしょうか?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.