Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查表达式是否为“constexpr”`_C++_C++11 - Fatal编程技术网

C++ 检查表达式是否为“constexpr”`

C++ 检查表达式是否为“constexpr”`,c++,c++11,C++,C++11,C++17添加constexpr if(如果条件是constexpr,则选择是否编译语句) 在C++11中模拟这种结构的有限形式有什么诀窍吗 如果在宏中需要以下构造: #define ALLOCATE(x) if ({x is a constant}) allocate_n<x>() else allocate(x) #如果({x是常数})定义分配(x)如果({x是常数})分配_n()否则分配(x) 在C++11中模拟这种结构的有限形式有什么诀窍吗 我能想到的最好的办法就是替

C++17添加constexpr if(如果条件是constexpr,则选择是否编译语句)

在C++11中模拟这种结构的有限形式有什么诀窍吗

如果在宏中需要以下构造:

  #define ALLOCATE(x) if ({x is a constant}) allocate_n<x>() else allocate(x)
#如果({x是常数})定义分配(x)如果({x是常数})分配_n()否则分配(x)
在C++11中模拟这种结构的有限形式有什么诀窍吗

我能想到的最好的办法就是替换

if constexpr ( cond ) statment-1 else statement-2;


假设您使用的是GCC或Clang,您可以使用以下扩展:

#define ALLOCATE(x) \
    __builtin_constant_p(x) \
        ? allocate_n<__builtin_constant_p(x) ? x : 0>() \
        : allocate(x)
#定义分配(x)\
__内置常数p(x)\
? 分配\
:分配(x)

如果constexpr这样做的话,
就不是这样了……你写这篇文章所花的时间比我编辑问题所花的时间要少。哇。@MichaelMoser有一小部分有毒用户,还有大量有用的用户,不幸的是,我们没有办法“投票给岛上的人”,所以说,是的,对于一个简单的误会来说,这是一个相当严厉的接待。但是,Brian是对的:
如果constexpr
(尽管名称不同)没有检查条件是否为
constexpr
,它要求它为,并有条件地编译其分支。传入非
constexpr
表达式是一个硬错误。我让你重述你的问题:)
template <bool>
void foo (/* ? */);

template <>
void foo<true> (/* ? */)
 { /* statement-1 */ }

template <>
void foo<false> (/* ? */)
 { /* statement-2 */ }
#define ALLOCATE(x) \
    __builtin_constant_p(x) \
        ? allocate_n<__builtin_constant_p(x) ? x : 0>() \
        : allocate(x)