【发布时间】:2019-11-13 15:04:36
【问题描述】:
在P1881 提案中,提出了 C++ 代码的时期(在模块级别)的概念。此类功能可以允许在模块级别自定义 C++ 语法和 C++ 行为,而不必破坏向后兼容性。 More elaborate motivation is given in the proposal。
提案中的隐式转换示例
版本 1:没有 epoch,一切都可以正常编译
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 中,epoch 被定义为模块级开关。除了方便之外,还有什么理由必须在模块级别上吗?为什么不是翻译单元级别?
- 因此,这种行为能否通过
#pragma无缝实现,提供编译器支持,或者与基于模块的提案相比会引入严重的技术困难(从实现或使用的角度来看)?
说,大致上:
#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
}
我已阅读the proposed mechanism,它针对基于模块的实现;但是,我不明白为什么必须是模块。
也相关:a lightning talk at CppCon 2019 of Vittorio Romeo, the author of P1881 proposal
【问题讨论】:
标签: c++ standards pragma c++-modules