使用clang ++ v4和gcc 6.3库的自定义分配器

时间:2017-05-11 19:38:24

标签: c++ clang c++14

我在使用clang ++ 4.0.0的自定义分配器时,在一个系统(arch linux)上遇到了很多麻烦,其中库带有gcc 6.3.1。这是一个最小的非工作示例:

#include <string>

struct myalloc : std::allocator<char> {
  using std::allocator<char>::allocator;
};

struct mystring 
  : std::basic_string<char, std::char_traits<char>, myalloc> {
  using std::basic_string<char, std::char_traits<char>, myalloc>::basic_string;
};

int
main()
{
  mystring r = "hello";
  mystring s (std::move(r));
}

我的意图显然是myalloc是一个自定义分配器,其行为与系统std::allocator完全相同,mystringstd::string相同,除了myalloc除外它使用g++ -std=c++14 -Wall -Werror。这应该是导致问题的最不可能的情况。 (显然,一旦这个工作,我想进一步自定义分配器。)

代码使用clang++ -std=c++14干净地编译,但In file included from strerror.cc:1: In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/string:52: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h:477:9: error: no matching constructor for initialization of 'std::__cxx11::basic_string<char, std::char_traits<char>, myalloc>::_Alloc_hider' : _M_dataplus(_M_local_data(), std::move(__str._M_get_allocator())) ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ strerror.cc:7:8: note: in instantiation of member function 'std::__cxx11::basic_string<char, std::char_traits<char>, myalloc>::basic_string' requested here struct mystring ^ /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h:109:2: note: candidate constructor not viable: no known conversion from 'typename std::remove_reference<allocator<char> &>::type' (aka 'std::allocator<char>') to 'const myalloc' for 2nd argument _Alloc_hider(pointer __dat, const _Alloc& __a = _Alloc()) ^ /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h:107:14: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 2 were provided struct _Alloc_hider : allocator_type // TODO check __is_final ^ /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h:107:14: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided 1 error generated. 失败并显示:

_IO_DOALLOCATE (fp)

这只是clang或gcc库中的错误,还是我的代码在概念上有问题?

1 个答案:

答案 0 :(得分:2)

最小示例的最小修复是将此成员添加到struct myalloc

template<class> struct rebind {
    using other = myalloc;
};

当然最好不要继承std :: allocator(在这种情况下你不需要重新绑定),也不要继承字符串,这些类不是公共基础。