C++11 C++;11 constexpr兼容性实现

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

在一个示例中,我使用CMake模块来检测C++11功能是否可用。模块生成一个文件,其中包含一些功能的兼容性实现,如
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来说,这不再是真的了。