强制 constexpr 函数的 constexpr 的惯用方法
Idiomatic way to enforce constexpr-ness of constexpr functions
请考虑以下示例代码:
#include <tuple>
void blah();
int buh;
constexpr auto get()
{
return std::get<0>(std::make_tuple(&blah, &buh));
}
int main()
{
get();
}
人们会期望,由于函数get()
是一个常量表达式,它将返回一个常量。
事实并非如此:std::make_tuple
,std::get
被实例化并调用:https://godbolt.org/g/PkHrTp
现在,如果我们get()
用
constexpr auto get()
{
constexpr auto x = std::get<0>(std::make_tuple(&blah, &buh));
return x;
}
我们得到预期的行为:参数x
的计算被优化出来,即使在-O0和make_tuple
,get
没有实例化,这对于减少二进制膨胀是相当有用的。
有没有一种惯用的方法来强制表单的功能始终像第二个示例中constexpr auto foo()
行为?
现在我会求助于:
#define constexpr_return(X) do { constexpr auto constexpr_return_x_ = X; return constexpr_return_x_; } while(0)
constexpr_return(std::get<0>(std::make_tuple(&blah, &buh)));
例如,但我不知道这是否是最佳的。
template<auto x>
std::integral_constant< std::decay_t<decltype(x)>, x > k{};
非类型模板参数实际上必须在编译时计算。
k<get()>
或在某些极端情况下,k<get()>()
可能会做你想做的事。
这不适用于不能作为非类型模板参数传递constexpr
值,但它确实适用于整数、指针和函数指针。
相关文章:
- 类无法访问自己的私有静态 constexpr 方法 - Clang bug?
- 从非类型模板参数声明 constexpr 数组的可移植方法
- 调用模板参数 constexpr 方法?
- MSVC使用constexpr-if从可变模板方法中的基本模板参数中吞下const
- 强制 constexpr 函数的 constexpr 的惯用方法
- 用霍纳方法进行多项式求值的C++ constexpr
- 为什么 constexpr 假设我的方法就是 const
- 是否有一种方法可以避免标头文件中使用的constexpr函数输入全局范围,而无需额外的名称空间
- 使用方法失败更改constexpr对象成员
- 当应用于静态方法时,为什么constexpr属性不起作用
- 如何在 C++11 中编写这个 C++17 静态 constexpr 方法
- 只要调用的函数是用constexpr指定的,就将委托方法声明为constexpr
- 使用constexpr方法在结构内部进行模板参数化
- 带字符串操作变通方法的constexpr
- 是否有模板/constexpr/ c++ 11替代x -宏的方法?
- Constexpr类与数组构造函数方法
- 静态constexpr方法实现导致GCC错误
- 在c++ 11或更高版本中,是否有一种方法可以让constexpr在没有UB的情况下确定endian ?
- 声明constexpr函数或方法
- 在C++11中计算编译时的斐波那契数(递归方法)(constexpr)