如果在 C++14 或更高版本上,不是 const 的成员函数只能是 constexpr

member function that is not const should only be constexpr if on C++14 or later

在 C++11 中,成员函数上的 constexpr 意味着 const。这在 C++14 中有所改变。

我有一些代码有一个成员函数,它应该是 constexpr,但不能是 const,所以如果用 std c++14 或更高版本编译,我希望它是 constexpr。一种方法是:

class Foo {
#if _cplusplus >= 201402L
    constexpr
#endif
    int baz(const Bar& bar);
};

有没有更好的表达方式,最好不用预处理器?

最好的方法是利用功能测试宏,作为 SD-6 的一部分。 constexpr 成员函数不是隐式 const 的更改被标记为 __cpp_constexpr 具有值 201304。所以这应该是你的测试:

class Foo {
#if __cpp_constexpr >= 201304L
    constexpr
#endif
    int baz(const Bar& bar);
};

如果您对多个成员函数执行此操作,您可能希望概括为:

#if __cpp_constexpr >= 201304L
#  define CONSTEXPR_MEM constexpr
#else
#  define CONSTEXPR_MEM
#endif

class Foo {
    CONSTEXPR_MEM int baz(const Bar& bar);
};

你在问题中提出的方式(使用__cplusplus)是完全有效的——特征测试宏的优点是不同的编译在不同的阶段采用不同的特征,所以你可以获得更多颗粒状,准确的测试。展望未来,所有主要供应商都同意 SD-6 是正确的方向,这将是未来的做事方式。

请注意,没有 方式可以在没有预处理器的情况下表达这一点。没有条件constexpr。只有 constexpr