“auto *const”具有 std::_Array_iterator<char, 48> 类型的不兼容初始值设定项

Bip*_*uti 3 c++ algorithm pointers iterator stdarray

我正在尝试使用clang 11.0.1为 PS4 平台编译此代码。初始化some_arraystd::arraystd::array<char, 48> some_array{{}};

auto* const characters = std::remove(some_array.begin(),
                        some_array.begin() + length, filtered_character);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

'auto *const' has incompatible initializer of type std::_Array_iterator<char, 48>
Run Code Online (Sandbox Code Playgroud)

我不确定是否需要使用cmake或与逻辑有关的内容来抑制警告。

JeJ*_*eJo 5

返回前向迭代器std::remove而不是指针

\n
template< class ForwardIt, class T >\nForwardIt remove( ForwardIt first, ForwardIt last, const T& value );\n^^^^^^^^^^\n
Run Code Online (Sandbox Code Playgroud)\n

在你的情况下,它是类型

\n
std::array<char, 48>::iterator\n
Run Code Online (Sandbox Code Playgroud)\n

因此,您不需要添加auto*,而是让编译器为您推导类型。所以你只需要auto

\n
auto characters = std::remove(some_array.begin()\n    , some_array.begin() + length\n    , filtered_character);\n
Run Code Online (Sandbox Code Playgroud)\n

为了验证类型。看这里

\n
#include <type_traits> // std::is_same_v\n\nauto characters = std::remove(some_array.begin()\n    , some_array.begin() + length\n    , filtered_character);\n\nstatic_assert(std::is_same_v<decltype(characters), std::array<char, 48>::iterator>\n    , "Are not same!");\n
Run Code Online (Sandbox Code Playgroud)\n
\n

作为旁注,该算法std::remove实际上不会删除任何元素,而只会将它们移动到序列的末尾,这样所有“删除”的元素都会落在范围内的某个边界后面。

\n

如果您的意图是删除元素,您应该考虑使用诸如std::vectorerase \xe2\x80\x93remove 习惯用法或简单的(Since C++20)std::list的容器,例如, 等。这是不可能的std::erasestd::array

\n