在C ++ 11中,成员函数上的constexpr表示const。这在C ++ 14中已更改。
我有一些代码具有应为constexpr的成员函数,但不能为const,因此,如果使用std c ++ 14或更高版本进行编译,我希望它为constexpr。一种方法是:
class Foo {
#if _cplusplus >= 201402L
constexpr
#endif
int baz(const Bar& bar);
};
有没有更好的方式来表达这一点,最好没有预处理器?
答案 0 :(得分:6)
做到这一点的最佳方法是利用功能测试宏作为SD-6的一部分。 constexpr
成员函数不是隐式const
的更改被标记为具有值__cpp_constexpr
的{{1}}。因此,这应该是您的测试:
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);
};
表示问题的方式是完全正确的-功能测试宏的优点在于,不同的编译器在不同的阶段采用了各种功能,因此您可以获得更细致,准确的测试。展望未来,所有主要供应商都同意SD-6是正确的方向,这将是将来的工作方式。
请注意,没有预处理器就没有没有的表达方式。没有条件__cplusplus
。只有constexpr
。