4

在以下代码中,编译器抱怨为:struct std::array<double,5ul> has no member named 'assign'. 在这里,这似乎是可能的。为什么会这样?(编译器:g++ 4.8.2)

#include <array>

int main()
{
    std::array<double,5> arr;
    arr.assign(4.); // error: has no member named 'assign'
    return 0;
}
4

4 回答 4

14

array::assign()是一个 Visual Studio 扩展。您正在使用 g++ 进行编译。在这里检查标准 g++ 数组

于 2014-06-17T05:52:25.370 回答
9

如前所述,根本没有assign成员 to std::array

现在有趣的问题变成了为什么?毕竟其他容器都有assign成员方法!

我会注意到,与其他容器不同,std::array它具有固定大小。如果你使用std::vector<T>::assign(这将是一个近似的等价物),向量会被适当地调整大小以匹配被分配的序列的大小;但是,使用数组是不可能的:

  • 如果分配的序列比数组短,你会怎么做?
  • 如果分配的序列比数组长,你会怎么做?

这将是违反直觉的,因为其他容器不会出现问题,因为它们的大小只是动态调整的。

出于类似的原因,std::array没有:reserve, capacity, clear, insert, emplace, erase, push/ pop(和变体)或resize. 他们都假设一个容器的大小可能会有所不同。

于 2014-06-17T06:21:10.563 回答
5

这很简单,正如您在此处看到的,std 数组没有分配成员函数。fill但是,您应该可以使用一个名为的成员函数。

于 2014-06-17T05:51:11.433 回答
2

assign方法不是它的成员std::array。该成员fill执行assignTR1 中的操作。

assign最初是std::tr1::array(来自TR1)的一部分,并被更改为fill大约 C++0x(现为 C++11)草案 n2798(2008)。

这并不是真正的 Microsoft 扩展,我想他们可能已经维护了这种方法以兼容并支持tr1生产中的实现(方法实现完全相同)。

于 2014-06-17T10:02:49.333 回答