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

Phi*_*ipp 5 c++ member-functions c-preprocessor constexpr c++14

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

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

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

是否有更好的方式表达这一点,最好没有预处理器?

Bar*_*rry 6

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

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

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

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

class Foo {
    CONSTEXPR_MEM int baz(const Bar& bar);
};
Run Code Online (Sandbox Code Playgroud)

在问题(使用__cplusplus)中呈现它的方式是完全有效的 - 功能测试宏的优点是不同的编译在不同阶段采用各种功能,因此您可以获得更精细,更准确的测试.展望未来,所有主要供应商都同意SD-6是正确的方向,这将是未来做事的方式.

请注意,没有预处理器就无法表达这一点.没有条件的constexpr.只有constexpr.