这个片段有什么问题?

What's wrong in this snippet?

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

error: member function 'swap' not viable: 'this' argument has type 'const array', but function is not marked 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 但我也认为这没有什么坏处。

怎么了?

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

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

你可以这样做:

using elem_type = decltype(getArrElement());
std::vector<elem_type> vec = { getArrElement(), getArrElement(), getArrElement() };
std::reverse(vec.begin(), vec.end());

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

    using element_type = decltype(std::declval<MyClass>().getArrElement());
    element_type vec[] = { getArrElement(), getArrElement(), getArrElement() };
    std::reverse(std::begin(vec), std::end(vec));