如果在 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
。
在 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
。