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 でなければならない理由がわかりません。