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)
是否有更好的方式表达这一点,最好没有预处理器?
最好的方法是利用功能测试宏,作为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.