在project中,我使用CMake模块WriteCompilerDetectionHeader来检测C++ 11功能是否可用。该模块为static_assert
等功能生成兼容性实现的文件:如果该功能可用,则为该功能声明的宏扩展为该功能;否则它会扩展到一些退步。C++ 11 constexpr兼容性实现
功能constexpr
没有兼容性实现。我试图提供一个,最后实现了一个双重实现:一个用于constexpr变量,另一个用于constexpr函数。
在cmake的文件:
write_compiler_detection_header(
FILE "${CMAKE_CURRENT_BINARY_DIR}/foo-compilerdetection.h"
PREFIX Foo
COMPILERS
GNU
MSVC
FEATURES
cxx_constexpr
)
在全局头:
#include "foo-compilerdetection.h"
#ifdef Foo_COMPILER_CXX_CONSTEXPR
# define Foo_CONSTEXPR_FUNCTION constexpr
# define Foo_CONSTEXPR_OBJECT constexpr
#else
# define Foo_CONSTEXPR_FUNCTION inline
# define Foo_CONSTEXPR_OBJECT const
#endif
所以对于constexpr
将与预选赛const
更换和功能将与预选赛inline
替代变量。
这些替换是否合适?其他限定符或组合或限定符是否更适合变量和函数?
'难道这些替代adequat?'这取决于你如何使用那些'constexpr'函数/变量;如果你使用'constexpr'函数的结果作为模板参数,'inline'不足以支持 –
在C++ 11中,constexpr成员函数也是const。但是,C++ 14并不是这样。 – Dutow