我的分配器中的select_on_container_copy_construction
没有被std:::string
调用。与vector
坚韧一起使用时,它可以正常工作。为什么行为不同?这是GCC中的错误吗?
我正在使用gcc版本5.4.0。
具有最小分配器的代码示例:
#include <iostream>
#include <vector>
template<class T>
class allocator {
public:
typedef T value_type;
using propagate_on_container_copy_assignment = std::true_type; // for consistency
using propagate_on_container_move_assignment = std::true_type; // to avoid the pessimization
using propagate_on_container_swap = std::true_type; // to avoid the undefined behavior
allocator<T> select_on_container_copy_construction() const {
throw std::bad_alloc();
}
T *allocate(const std::size_t n) {
return static_cast<T *>(::operator new(n * sizeof(T)));
}
void deallocate(T *, const std::size_t) { }
};
template< class T1, class T2 >
bool operator==(const allocator<T1>&, const allocator<T2>&) noexcept {
return true;
}
template< class T1, class T2 >
bool operator!=(const allocator<T1>&, const allocator<T2>&) noexcept {
return false;
}
int main()
{
try {
std::basic_string<char, std::char_traits<char>, allocator<char>> s;
auto ss = s;
} catch (std::bad_alloc const&) {
std::cout << "string worked\n";
}
try {
std::vector<int, allocator<int>> v;
auto vv = v;
} catch (std::bad_alloc const&) {
std::cout << "vector worked\n";
}
}
该程序应同时打印“字符串有效”和“矢量有效”,但仅打印后者。
最佳答案
这是libstdc ++中的一个错误,在this PR的6.1版本中已解决。
具体的相关变化来自:
basic_string(const basic_string& __str)
: _M_dataplus(_M_local_data(), __str._M_get_allocator()) // TODO A traits
至:
basic_string(const basic_string& __str)
: _M_dataplus(_M_local_data(),
_Alloc_traits::_S_select_on_copy(__str._M_get_allocator()))
我不确定是否有未解决的错误报告。我找不到一个,并且提交消息没有引用一个。