在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 中,epochs 被定义为模块级开关。除了方便之外,还有什么理由必须在模块级别上吗?为什么不是翻译单元级别?
- 因此,
#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。