从N4720 C++ 模块草案中,[basic.def.odr]/6 说:
[…]对于具有出口声明的实体,该实体应只有一个定义;仅当模块的抽象语义图包含实体的定义时,才需要进行诊断。[注:如果定义不在接口单元中,则最多一个模块单元可以拥有并使用该定义。— 尾注] […]
根据我的理解,这实际上使模板有机会只被编译器解析一次,这与当前的事态(每个翻译单元都有其定义的精确副本)形成鲜明对比。这对于具有类似情况的其他实体也有效,例如内联函数/变量。
我的问题源于这样一个事实,因为每个翻译单元最多只能有一个实体定义(如[basic.def.odr]/1中所述),因此跨 TU 具有不同的实体定义是未定义的行为. 而且,由于导出的实体在整个编译单元中只有一个定义(使未导出的实体对其实现单元唯一),因此在我看来,如果不是不可能的话,弄错定义会更难。
最后,简单地说:模块的使用是否会(或是否,或应该)使违反 ODR 规则变得不可能,或者更难出错?