这个片段有什么问题?
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));
我不知道这段代码有什么问题。我收到此错误:
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));