我在使用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()
方法是否有任何怪癖或限制?如有任何协助,将不胜感激。提前感谢您的帮助!
1条答案
按热度按时间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++17
或GNU C++20
编译器可能对应于很多不同版本的gcc
,每个版本对语言功能和标准库功能的支持程度都不同。