非const的成员函数仅在C ++ 14或更高版本上才应为constexpr

时间:2018-12-16 19:31:06

标签: c++ c++14 c-preprocessor constexpr member-functions

在C ++ 11中,成员函数上的constexpr表示const。这在C ++ 14中已更改。

我有一些代码具有应为constexpr的成员函数,但不能为const,因此,如果使用std c ++ 14或更高版本进行编译,我希望它为constexpr。一种方法是:

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

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

1 个答案:

答案 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