3

P1881提案では、C++ コードのエポック (モジュール レベル) の概念が提案されています。このような機能により、下位互換性を損なうことなく、モジュールのレベルで C++ の構文と C++ の動作をカスタマイズできます。より精巧な動機が提案に示されています。

提案からの暗黙の変換の例

バージョン 1 : エポックなし、すべて正常にコンパイル

module ParticleMovement;

export void move(Particle&, float x, float y);

void moveExample()
{
    Particle p{};
    move(p, 3.42, 2.49);    // OK
}

バージョン 2 : epoch 2023(暗黙的な変換を無効にすることを前提として)、コードの形式が正しくありません:

epoch 2023;                 // Module-level switch
module ParticleMovement;

export void move(Particle&, float x, float y);

void moveExample()
{
    Particle p{};

    move(p, 3.42, 2.49);    // Compilation error

    move(p, 3.42f, 2.49f);  // OK, no implicit conversions
}

これは間違いなく興味深い提案であり、単にコンパイル スイッチを指定するのとは大きく異なります-std=c++XXX

しかし、私は疑問に思います:

  • P1881 では、エポックはモジュールレベルのスイッチとして定義されています。利便性以外に、モジュールレベルでなければならない理由はありますか? なぜ翻訳単位レベルではないのですか?
  • その結果、この動作#pragmaは、モジュールベースの提案と比較して、コンパイラサポートを提供するか、または (実装または使用の観点から) 深刻な技術的困難をもたらす 's を介してシームレスに達成できますか?

次のようなことを言ってください。

#pragma epoch 2023;                 

export void move(Particle&, float x, float y);

void moveExample()
{
    Particle p{};

    move(p, 3.42, 2.49);    // Compilation error

    move(p, 3.42f, 2.49f);  // OK, no implicit conversions
}

モジュールベースの実装を対象とする提案されたメカニズムを読みました。ただし、それが modules でなければならない理由がわかりません。


関連: CppCon 2019 での Vittorio Romeo のライトニング トーク (P1881 提案の著者)

4

1 に答える 1