向量必须具有与其分配器相同的值

时间:2018-08-19 17:45:29

标签: c++ c++17 gcc8

此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进行编译/运行。

我的问题:

这是什么原因,为什么即使使用带有C ++ 17设置的gcc 7.3也无法使用gcc 8.2编译此代码,所以没有其他更改。这就是令我困惑的地方。某个地方改变了某些东西,这些东西显然并没有用C ++做任何事情。

查看live-clang 6.0也接受带有FaF::smatch的版本。

编译器标志:
-O3 -std=c++17 -Werror -Wextra -Wold-style-cast -Wall

1 个答案:

答案 0 :(得分:4)

我将此案件提交给gnu gcc bug database,解决方法是:

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

以下是来自gnu bug数据库链接的答案:

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 -Wall


If you use -std=gnu++17 then your code will be accepted,
  but is not portable and is not valid C++.

我要感谢gnu团队的快速回复,这也对SO社区有所帮助!