相关疑难解决方法(0)

强制在编译期间评估常量表达式?

几天前,我询问编译器决定是否在编译期间计算constexpr函数.

什么时候constexpr函数在编译时得到评估?

事实证明,只有在编译时才会评估constexpr,如果所有参数都是常量表达式,并且您指定给它的变量也是常量表达式.

template<typename base_t, typename expo_t>
constexpr base_t POW(base_t base, expo_t expo)
{
    return (expo != 0 )? base * POW(base, expo -1) : 1;
}

template<typename T>
void foobar(T val)
{
    std::cout << val << std::endl;
}

int main(int argc, char** argv)
{
    foobar(POW((unsigned long long)2, 63));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我被告知是真的,这个代码示例是非常不实际的,因为foobar不接受constexpr(由于某种原因你不能使用consexpr作为参数),POW在运行时被评估,即使它可能是可能的在编译期间计算它.强制编译时评估的明显解决方案是:

auto expr = POW((unsigned long long)2, 63);
foobar(expr);
Run Code Online (Sandbox Code Playgroud)

然而,这迫使我使用额外的代码行,每次我想确保在编译时评估constexpr时都不需要这样做.为了使这更方便一点,我想出了以下可疑的宏:

#define FORCE_CT_EVAL(func) [](){constexpr auto ___expr = func; return std::move(___expr);}()
foobar(FORCE_CT_EVAL(POW((unsigned long long)2, 63)));
Run Code Online (Sandbox Code Playgroud)

尽管它工作得很好,但我觉得好像有些不对劲.创建匿名lambda会影响性能吗?通过rvalue引用返回实际上是将表达式移动到函数参数吗?std :: move如何影响性能?有没有更好的单线解决方案呢?

c++ evaluation compile-time constexpr c++11

11
推荐指数
1
解决办法
2084
查看次数

用于编译时强制 constexpr 函数评估的单表达式助手可能吗?

@cyberpunk_试图实现一些目标,并提出了一些问题,但所有的追逐都归结为:

是否可以构建一个工具来强制执行constexpr函数的编译时评估?

int f(int i) {return i;}
constexpr int g(int i) {return i;}

int main()
{
    f(at_compilation(g, 0));
    int x = at_compilation(g, 1);
    constexpr int y = at_compilation(g, 2);
}
Run Code Online (Sandbox Code Playgroud)

在所有情况下,at_compilation强制执行g.

at_compilation不需要采用这种形式。

要求

  • 允许任何(数字本机)文字类型作为 constexpr 函数的输入。
    • 这也可以根据函数参数类型进行硬编码。
  • 允许任何(数字本机)文字类型作为输出,这是 constexpr 函数调用的结果。
    • 这也可以根据函数返回类型进行硬编码。

理想者

  • 减少宏的使用,但不要害怕使用。
  • 是通用的(不是硬编码的类型)。
  • 支持任何文字类型。最后,任何数字本机文字类型都是必需的。

相关问题:

  1. constexpr 函数何时在编译时进行求值?
  2. 强制在编译时计算常量表达式?
  3. 将任何函数作为模板参数传递?
  4. C++11 标准中的哪个位置指定了何时可以在翻译过程中计算 constexpr 函数?

相关代码示例的答案:

  • 1
  • 2
  • 3(这个有一个说明性的AT_COMPILATION宏)

所有代码示例都有关于要求的限制。

清楚地解释这在 C++ 中如何不可行也是一个很好的答案。

我怀疑这是不可能的,基于@K-ballo / @Herb Sutter 的 回答 …

c++ macros variadic-templates constexpr c++11

5
推荐指数
1
解决办法
3154
查看次数