вектор должен иметь то же значение, что и его распределитель

Этот MCVE компилируется / работает с gcc 7.3:
Пожалуйста, обратите внимание, что этот MCVE был значительно уменьшен, что позволяет воспроизводить ошибки, поэтому код в Allocator Шаблон не имеет смысла, но он не влияет на установку!

#include <regex>
#include <string>
#include <iostream>

namespace FaF
{
template <typename T>
class Allocator
{
public:
typedef T value_type;

Allocator() throw() {}
template <typename U> Allocator (const Allocator<U>&) throw() {}
~Allocator() throw() {}

T* allocate (std::size_t num, const void* hint = 0)
{
(void) hint; (void) num;
return  new ( T );
}

void deallocate (T* p, std::size_t num) { (void) num; (void) p; }
};

using string = std::basic_string<char, std::char_traits<char>, Allocator<char>>;
using smatch = std::match_results<FaF::string::const_iterator, Allocator<FaF::string::const_iterator>>;
}

int main()
{
FaF::smatch results {};
std::cout << "OK\n";
}

где Allocator мой собственный распределитель

Сейчас мы используем gcc 8.2 и получаем эту ошибку

    FaF::smatch results {};
^--- vector must have the same value as its allocator

Когда я меняюсь FaF::smatch по умолчанию std::smatch затем он компилируется / запускается с gcc 8.2.

Мой вопрос:

В чем причина и почему этот код не компилируется с gcc 8.2, даже с gcc 7.3 с настройкой C ++ 17 — больше ничего не изменилось. Это то, что смущает меня. Где-то изменилось что-то, что не имеет ничего общего с C ++.

Видеть это жить — Clang 6.0 принимает версию с FaF::smatch также.

Флаги компилятора:
-O3 -std=c++17 -Werror -Wextra -Wold-style-cast -Wall

3

Решение

Я подал это дело в база данных ошибок gnu gcc и решение таково:

using smatch = std::match_results<FaF::string::const_iterator,
Allocator<std::sub_match<FaF::string::const_iterator>>>;
^^^^^^^^^^^^^^^

Вот ответ из ссылки на базу данных ошибок gnu:

The value type of match_result<Iter> is sub_match<Iter>,
so you need to use Allocator<sub_match<Iter>> not Allocator<Iter>.

> Changing it to std::smatch then it compiles.Because that uses the correct allocator type.

> Compiler options:
> -O3 -std=c++17 -Werror -Wextra -Wold-style-cast -WallIf you use -std=gnu++17 then your code will be accepted,
but is not portable and is not valid C++.

Я хочу поблагодарить команду gnu за очень быстрый ответ, который также помогает сообществу SO!

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]