-2

我不知道这个片段有什么问题。我收到此错误:

错误:成员函数“swap”不可行:“this”参数的类型为“const array”,但函数未标记为 const

#include <algorithm>
#include <memory>
#include <iostream>
#include <array>

struct MyClass {
  std::array<float, 4> arr;  
  float carr[4];

  std::array<float, 4> getArrElement() {
    std::array<float, sizeof(carr) / sizeof(float)> out;
    return out;
  }

  void fun() {
    auto vec = { getArrElement(), getArrElement(), getArrElement() };
    std::reverse(vec.begin(), vec.end()); // <-- error line here
  }


};

int main()
{
    MyClass obj;
    obj.fun();
}

getArrElement没有返回const数组。auto应该推导出来,std::initializer_list但我也认为这没有什么害处。

怎么了?

4

2 回答 2

6

Astd::initializer_list只有 const 迭代器,所以你不能改变它的元素。

Aninitializer_list 不是容器,不能像容器一样对待。它是编译器已知的一种特殊的hack语言支持类型,用于支持特定的语法。不要尝试将其用作通用容器或类似序列的类型。

你可以做:

using elem_type = decltype(getArrElement());
std::vector<elem_type> vec = { getArrElement(), getArrElement(), getArrElement() };
std::reverse(vec.begin(), vec.end());
于 2015-12-21T11:02:24.760 回答
2

如上所述,如果数组仅在本地使用并且从不截断、扩展或移动,那么通过使用自由函数begin()end()我们可以避免分配向量的开销......

    using element_type = decltype(std::declval<MyClass>().getArrElement());
    element_type vec[] = { getArrElement(), getArrElement(), getArrElement() };
    std::reverse(std::begin(vec), std::end(vec));
于 2015-12-21T11:26:41.280 回答