gpt4 book ai didi

c++ - 如何正确传递constexpr参数?

转载 作者:行者123 更新时间:2023-12-02 10:10:26 24 4
gpt4 key购买 nike

例如,我得到了以下代码:

constexpr static std::size_t ConstexprFunction(const int value) {
return value;
}

static constexpr std::size_t CallConstexptrFunction(const int value) {
constexpr std::size_t v = ConstexprFunction(value);
return v;
}

int main() {
constexpr int test = 42;
CallConstexptrFunction(test);
}
编译器会认为 constexpr variable 'v' must be initialized by a constant expression看起来像 ConstexprFunction实际上在运行时而不是编译时运行。我将代码更改为此:
static constexpr std::size_t CallConstexptrFunction(const int value) {
constexpr std::size_t v = value;
return v;
}

int main() {
constexpr int test = 42;
CallConstexptrFunction(test);
}
并且错误保持不变,这可能证明在 value中使用 CallConstexptrFunction时,将其视为运行时变量而不是 contexpr变量。
当前我的解决方案是将功能参数更改为模板参数,以避免参数传递:
constexpr static std::size_t ConstexprFunction(const int value) {
return value;
}

template<int SIZE>
static constexpr std::size_t CallConstexptrFunction() {
constexpr std::size_t v = ConstexprFunction(SIZE);
return v;
}
还有一个类似的 question,但问题是:
  • 它基于C++ 11。
  • OP的一种解决方案是使函数在运行时运行,不知道是否授予OP奖励(这种情况是他直接调用了返回的函数,而不是由constexpr变量保存返回值)。

  • 在阅读了问题之后,这是我的问题:
  • 模板版本是否会生成太多实例,从而导致代码太大?
  • 是否可以在不使用模板的情况下完成函数参数的传递(欢迎使用任何版本,甚至C++ 20),我尝试使用constexpr int value作为参数,并使用Clang和C++ 20实验,似乎仍然不允许使用此语法。
  • 最佳答案

    在CallConstexptrFunction的上下文中,表达式ConstexprFunction(value)并非constexpr,因为value可能具有动态生存期,因此v的初始化是非法的。
    正确的方法是做这样的事情

    constexpr std::size_t ConstexprFunction(const int value) {
    return value;
    }

    constexpr std::size_t CallConstexptrFunction(const int value) {
    return ConstexprFunction(value);
    }

    int main() {
    constexpr int test = 42;
    constexpr auto res = CallConstexptrFunction(test);
    return res;
    }
    main()中的 CallConstexptrFunction(test)constexpr表达式。因此,编译器会很乐意对其进行评估,生成类似于以下代码的内容。
        mov     eax, 42
    ret

    关于c++ - 如何正确传递constexpr参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63808269/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com