c++ - 不为 std::string 调用 select_on_container_copy_construction
问题描述
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++ 中的一个错误,此 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()))
我不确定是否有打开的错误报告。我找不到一个,并且提交消息没有引用一个。
推荐阅读
- memory - 内存访问粒度与缓存线
- javascript - Discord.js 中的反应
- c++ - 在主目录中本地安装 gcc
- amazon-web-services - 如何使用 cloudformation 从 S3 ARN 获取 S3 存储桶名称
- highcharts - 在 highcharts 甘特图中为 yAxis 添加自定义列
- python - 有没有一种简单的方法来检测输入是否包含“%”?
- linux - 有没有办法为 shell 运行的脚本提供实时输入?
- gremlin - Gremlin:调用 fold() 或 count() 后无法返回上一步
- rust - Rust 自引用结构
- python - ValueError 值的长度与索引的长度不匹配