C++ GCC手工制作的constexpr find vs std::find

C++ GCC手工制作的constexpr find vs std::find,c++,gcc,c++17,constexpr,C++,Gcc,C++17,Constexpr,我正试图用c++17实现一个constexpr find,以查找数组中匹配元素的索引,非常类似于。下面是一个非常简单的int数组实现 注意:叮当作响的树干似乎正确地推断出了我的::find。但这与constepr IMHO关系不大,因为即使没有它,clang也会推断结果。除非在const表达式中使用了constepr函数,否则不需要在编译时调用constepr函数。然后依赖于编译器优化 在constexpr中转换调用代码可确保编译时计算: int main() { static cons

我正试图用c++17实现一个constexpr find,以查找数组中匹配元素的索引,非常类似于。下面是一个非常简单的int数组实现


注意:叮当作响的树干似乎正确地推断出了我的::find。但这与constepr IMHO关系不大,因为即使没有它,clang也会推断结果。

除非在const表达式中使用了constepr函数,否则不需要在编译时调用constepr函数。然后依赖于编译器优化

在constexpr中转换调用代码可确保编译时计算:

int main()
{
    static constexpr std::array<int, 5> a{4, 10, 5, 889, 45};
    constexpr auto b = mine::find(a.begin(), a.end(), 5);
    constexpr auto c = std::distance(a.begin(), b);

    return c; // return 2 directly
}

如果你关心这一点,为什么不使用-O3?无法推断是什么意思?您的链接显示它正在编译,而您的示例并不要求它是constexpr?如果您想在编译时调用您的方法,请在常量表达式中使用它:add constexpr for b。目前,您只需检查编译器在优化代码方面有多好。@巴里,我想他们是在问这个问题。@Xenonamous如果您的问题是为什么编译器不为std::find生成任何程序集,那么答案是因为它比非标准函数更了解如何优化标准函数。GCC恰好优化了您的mine::find,当您通过-O3标志而不是-O2时:
int main()
{
    const std::array<int, 5> a{4, 10, 5, 889, 45};
    constexpr auto b = mine::find(a.begin(), a.end(), 5);
    auto c = std::distance(a.begin(), b);

    return c;
}
int main()
{
    static constexpr std::array<int, 5> a{4, 10, 5, 889, 45};
    constexpr auto b = mine::find(a.begin(), a.end(), 5);
    constexpr auto c = std::distance(a.begin(), b);

    return c; // return 2 directly
}