【发布时间】:2010-10-17 07:58:04
【问题描述】:
在我看到这段代码之前,我一直认为 STL 函数只能用于 STL 数据容器(如 vector):
#include <functional>
#include <iostream>
#include <numeric>
using namespace std;
int main()
{
int a[] = {9, 8, 7};
cerr << "Sum: " << accumulate(&a[0], &a[3], 0, plus<int>()) << endl;
return 0;
}
它使用 g++ 编译和运行,没有任何警告或错误,正确的输出总和为 24。
C++/STL 标准允许使用带有 STL 函数的数组吗?如果是的话,像数组这样的古老结构如何适应模板化迭代器、容器和函数的宏伟 STL 计划?此外,在这种用法中是否有任何需要程序员小心注意的警告或细节?
【问题讨论】:
-
您最好使用 + 3 而不是 &a[3] :您可以引用该位置,但不能取消引用它。在 C 中,执行 &*(a + 3) 是合法的,但在 C++ 中,这是未定义的行为。在这种和类似的情况下,您可能会从编译器中的优化器中得到意外的惊喜
-
@litb:我不相信。我看到太多使用 &array[index] 的代码认为它是未定义的。据我所知,C++ 在这方面就像 C 中的普通旧数组一样,&array[index] 完全等于 &*(array+index) 或简单地 array+index。