gpt4 book ai didi

c++ - C++ 标准要求使用 allocator::rebind 吗?

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:44 34 4
gpt4 key购买 nike

我认为容器必须将它们提供的任何分配器重新绑定(bind)到一个有效的分配器中,但在随 LLVM(我猜是 libc++ 的一部分)附带的 STL 中,情况似乎并非如此。这是 LLVM 中的错误,还是标准不需要重新绑定(bind)?

以下代码片段可按预期使用 GCC 的 STL。它在 clang 3.3 附带的 STL 中失败(来自 MacPorts,在 Mac 上)。它在 Linux 上用 clang 编译得很好,但我认为它使用与 GCC 相同的 STL。

#include <vector>

int main()
{
std::vector<char, std::allocator<int> > c;
c.push_back(5);
}

错误是

clang++ test-rebind.cpp 
In file included from test-rebind.cpp:1:
/opt/local/libexec/llvm-3.3/bin/../lib/c++/v1/vector:505:5: error: implicit instantiation of undefined template '__static_assert_test<false>'
static_assert((is_same<typename allocator_type::value_type, value_type>::value),
^
/opt/local/libexec/llvm-3.3/bin/../lib/c++/v1/__config:412:35: note: expanded from macro 'static_assert'
typedef __static_assert_check<sizeof(__static_assert_test<(__b)>)> \
^
test-rebind.cpp:5:46: note: in instantiation of template class 'std::__1::vector<char, std::__1::allocator<int> >' requested here
std::vector<char, std::allocator<int> > c;
^
/opt/local/libexec/llvm-3.3/bin/../lib/c++/v1/__config:408:24: note: template is declared here
template <bool> struct __static_assert_test;
^
1 error generated.

最佳答案

23.2.1 [container.requirements.general]/7:

All other constructors for these container types take an Allocator& argument (17.6.3.5), an allocator whose value type is the same as the container’s value type.

所以你的代码是无效的。

不过,上面是一个很难找到它的地方。我们可以做得更好。表 99(分配器感知容器要求)在其第一行中要求容器具有 allocator_type 嵌套类型,其 value_type 与容器的相同。 vector(和其他容器)的概要定义 allocator_type 如下:

typedef Allocator allocator_type;

换句话说,您提供的 Allocator 参数负责满足要求。

关于c++ - C++ 标准要求使用 allocator::rebind 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22384231/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com