- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
select_on_container_copy_construction
在我的分配器中没有为 std::::string
调用。当与 vector
tough 一起使用时,它工作正常。为什么行为不同?这是 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";
}
}
程序应该同时打印“string worked”和“vector worked”,但它只打印了后者。
最佳答案
这是 libstdc++ 中的一个错误,在 6.1 版本中由 this PR 解决了.
具体的相关变化来自:
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()))
我不确定是否有公开的错误报告。我找不到,提交消息也没有引用。
关于c++ - 未为 std::string 调用 select_on_container_copy_construction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53852753/
对于分配器,为什么需要 select_on_container_copy_construction 而不是仅重载复制构造函数? 是否存在我们想要定义两个单独的复制构造实现的实例,具体取决于我们是否正在
我想提供一个自定义 select_on_container_copy_construction() http://www.cplusplus.com/reference/memory/allocato
select_on_container_copy_construction 在我的分配器中没有为 std::::string 调用。当与 vector tough 一起使用时,它工作正常。为什么行为不
我在 Visual Studio 2013 中遇到内部编译器错误。确切的错误是 c:\program files (x86)\microsoft visual studio 12.0\vc\inclu
正如标题所说,我正在尝试在我的可执行文件中使用 boost::container::vector,但出现以下错误`left of'.select_on_container_copy_construct
我正在尝试使用 boost::geometry::index::rtree 但出现以下错误 left of'.select_on_container_copy_construction' must h
我是一名优秀的程序员,十分优秀!