C++11 C++;11 constexpr兼容性实现
在一个示例中,我使用CMake模块来检测C++11功能是否可用。模块生成一个文件,其中包含一些功能的兼容性实现,如C++11 C++;11 constexpr兼容性实现,c++11,C++11,在一个示例中,我使用CMake模块来检测C++11功能是否可用。模块生成一个文件,其中包含一些功能的兼容性实现,如static\u assert:如果该功能可用,则为该功能声明的宏将扩展到该功能;否则,它会扩展为某种回退 功能constexpr没有兼容性实现。我试图提供一个,结果得到了一个双重实现:一个用于constexpr变量,一个用于constexpr函数 在cmake文件中: write_compiler_detection_header( FILE "${CMAKE_CURREN
static\u assert
:如果该功能可用,则为该功能声明的宏将扩展到该功能;否则,它会扩展为某种回退
功能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
这些替代品是阿迪奎特吗?其他限定符或组合或限定符是否更适合变量和函数?我认为它并没有那么简单<代码>常量表达式在编译期间计算<代码>常量和
内联
不可用。
我想,对于<代码> conExpRPR <代码>变量,你必须考虑两种可能性:<代码> const <代码>(你使用的)和预处理器宏(即定义PI 3.14)。一个是关于范围、调试等方面的,另一个是严格的编译时。
当涉及到
constexpr
函数时,它有点棘手。这样的函数可以在编译时计算,但不必这样做。如果你在进行编译时评估,你应该考虑模板和预处理器(我知道宏是邪恶的,但是……)。如果我们讨论的是应该在运行时评估的函数,那么内联或模板是最好的选择
预处理器宏是我所知道的唯一的
constexpr
替换,它可以用于switch
语句(如case
标签)或数组分配(int-tab[5];
),我认为这并不是那么简单<代码>常量表达式在编译期间计算<代码>常量和内联
不可用。
我想,对于<代码> conExpRPR <代码>变量,你必须考虑两种可能性:<代码> const <代码>(你使用的)和预处理器宏(即定义PI 3.14)。一个是关于范围、调试等方面的,另一个是严格的编译时。
当涉及到
constexpr
函数时,它有点棘手。这样的函数可以在编译时计算,但不必这样做。如果你在进行编译时评估,你应该考虑模板和预处理器(我知道宏是邪恶的,但是……)。如果我们讨论的是应该在运行时评估的函数,那么内联或模板是最好的选择
预处理器宏是我所知道的唯一的
constexpr
替换,它可以用在switch
语句(如case
标签)或数组分配(int tab[5];
)这些替换是否足够?这取决于您如何使用这些constexpr
函数/变量;例如,如果使用constepr
函数的结果作为模板参数,inline
在C++11中是不够的,constepr成员函数也是const的。但是C++14不再是这样了。这些替换是否足够?
这取决于如何使用这些constepr
函数/变量;例如,如果使用constepr
函数的结果作为模板参数,inline
在C++11中是不够的,constepr成员函数也是const的。但是对于C++14来说,这不再是真的了。