Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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++ 在C+中模拟虚构的constexpr#u断言的最佳方法是什么+;17?_C++_C++17_Assert_Constexpr_Static Assert - Fatal编程技术网

C++ 在C+中模拟虚构的constexpr#u断言的最佳方法是什么+;17?

C++ 在C+中模拟虚构的constexpr#u断言的最佳方法是什么+;17?,c++,c++17,assert,constexpr,static-assert,C++,C++17,Assert,Constexpr,Static Assert,我刚刚观看了cppcon,其中冻结库的作者解释了他如何在constexpr函数中使用assert,它是如何工作的(因为在运行时它可以正常工作,在编译时它会触发函数的非constexpr执行,所以会发生编译错误) 这样做的问题是,您不能像静态_assert那样向用户提供有意义的文本错误,并且在assert宏的实现中编译失败 另外,您不能对函数参数使用static_assert,因为它们不是constexpr,我不想将函数参数移到内部使其成为constexpr。这是我想要避免的转换示例: const

我刚刚观看了cppcon,其中冻结库的作者解释了他如何在constexpr函数中使用assert,它是如何工作的(因为在运行时它可以正常工作,在编译时它会触发函数的非constexpr执行,所以会发生编译错误)

这样做的问题是,您不能像静态_assert那样向用户提供有意义的文本错误,并且在assert宏的实现中编译失败

另外,您不能对函数参数使用static_assert,因为它们不是constexpr,我不想将函数参数移到内部使其成为constexpr。这是我想要避免的转换示例:

constexpr unsigned int safe_right_shift(const unsigned int val, const unsigned shift){
    assert(shift<sizeof(unsigned int)*CHAR_BIT); //ugly error
    return val >>shift;
}

template<unsigned int shift>
constexpr unsigned int safe_right_shift_t(const unsigned int val){
    static_assert(shift<sizeof(unsigned int)*CHAR_BIT);
    return val >>shift;
}
constexpr unsigned int safe_right_shift(const unsigned int val,const unsigned shift){
断言(移位>移位);
}
模板
constexpr unsigned int safe\u right\u shift\t(const unsigned int val){
静态_断言(shift>shift;
}
在C++17中,有没有更好的方法来实现假设的constexpr\u断言

我将constexpr_assert定义为仅在constexpr求值(又称编译时)期间检查值的断言

附言。 错误:

注意:非constexpr函数“\uuuu assert\u fail”不能在常量表达式中使用


您是否可以使用
assert(“移位量必须小于值的位大小”&&shiftI假设C++20契约可以工作,但在C++17中…我尝试过使用和滥用SFINAE,但没有得到任何结果…在这里可以证明非常有用。