gcc 使用GNU G++17和Clang++17/20编译器的C++17中的`std::reduce()`方法出错

wbrvyc0a  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(236)

我在使用C17中的std::reduce()方法与GNU G17和Clang17/20编译器时遇到了一个错误。尽管包含了<numeric>标头(它应该提供对reduce()方法的访问),编译器仍报告该方法未在当前作用域中声明。但是,当我切换到GNU G20编译器时,代码编译起来没有任何问题。
代码示例:

#include <iostream>
#include <numeric>

int main() {
    int arr[] = {1, 2, 3, 4, 5};

    // Attempting to use std::reduce() method
    int sum = std::reduce(std::begin(arr), std::end(arr), 0);

    std::cout << "Sum: " << sum << std::endl;

    return 0;
}

错误消息(编译器:GNU C++177.3.0):

program.cpp: In function 'int main()':
program.cpp:8:20: error: 'reduce' is not a member of 'std'
     int sum = std::reduce(std::begin(arr), std::end(arr), 0);
                    ^~~~~~

错误消息(编译器:叮++ 17/20):

p71.cpp:8:20: error: no member named 'reduce' in namespace 'std'
    int sum = std::reduce(std::begin(arr), std::end(arr), 0);
              ~~~~~^
1 error generated.

只有当我使用GNU C20编译器时,代码才能编译而没有任何问题。然而,我感到困惑,因为我已经包含了<numeric>头文件,而reduce()方法是在C17标准中引入的,它应该是可访问的。我想知道为什么在使用GNU G17和Clang17/20编译器时编译器无法编译代码。
我正在寻求澄清,以了解为什么这个错误发生在某些编译器,而不是其他人。有人可以帮助我了解并解决这个问题吗?在使用Clang编译器时,reduce()方法是否有任何怪癖或限制?如有任何协助,将不胜感激。提前感谢您的帮助!

pvabu6sv

pvabu6sv1#

std::reduce函数是从C++17开始的标准库的一部分。对于GNU,它在gcc版本9.1中实现。我不能确定clang的版本,但它至少可以让我回到clang-12
关于是否能够使用std::reduce,有两个门控因素:1)它是否在您正在使用的编译器版本的标准库中; 2)您是否选择C++17或更高版本作为语言标准。
根据您上面的描述,您使用的是gcc版本7.3.0,它没有在相应的标准库中实现std::reduce
说你正在使用GNU C++17GNU C++20编译器可能对应于很多不同版本的gcc,每个版本对语言功能和标准库功能的支持程度都不同。

相关问题