考虑头文件:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
或者,或者:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept;
int GetID() const noexcept;
};
inline T::T(int const ID_) noexcept : ID(ID_) {}
inline int T::GetID() const noexcept { return ID; }
在模块前世界中,这些标头可以按文本形式包含在多个TU中,而不会违反ODR。而且,由于所涉及的成员函数相对较小,因此编译器可能会“内联”(使用时避免调用函数)那些函数,甚至T
完全消除某些实例。
在有关C ++ 20完成的会议的最新报告中,我可以阅读以下声明:
我们阐明了
inline
模块接口中的含义:目的是,未明确声明的功能主体inline
不属于模块ABI的一部分,即使这些功能主体出现在模块接口中也是如此。为了使模块作者可以更好地控制他们的ABI,不再隐式地在模块接口的类主体中定义成员函数inline
。
我不确定我没有记错。这是否意味着在模块世界中,为了使编译器能够优化离开函数的调用,inline
即使它们在类中定义,我们也必须对其进行注释?
如果是这样,以下模块接口是否等同于上面的标头?
export module M;
export
class T
{
private:
int const ID;
public:
inline explicit T(int const ID_) noexcept : ID(ID_) {}
inline int GetID() const noexcept { return ID; }
};
即使我仍然没有支持模块的编译器,我还是希望inline
在适当的时候开始使用like,以最大程度地减少将来的重构。
inline
关键字的模块中的函数将永远不会被编译器内联,对吗?