Boost bimap 无法使用 gcc 10、c++20 进行编译。寻找临时修复
Boost bimap fails to compile with gcc 10, c++20. Looking for temporary fix
使用 gcc 10.1 和 boost 1.73.0,以下代码
#include <boost/bimap.hpp>
int main() {
boost::bimap<int, int> lookup;
}
使用标志 -O2 --std=c++20
无法编译,但使用标志 -O2 -std=c++17
会成功(已通过编译器资源管理器验证)。
这可能与以下问题有关:https://github.com/boostorg/bimap/pull/15(已弃用 std::allocator<void>
)
我现在可以使用一些解决方法来使此代码成功编译 --std=c++20
吗?
错误背后的原因并不是 std::allocator<void>
专业化被 删除。实际上,作为带有 void
参数的主模板,它仍然有效。代码无法编译,因为 ::rebind
不再是 std::allocator
本身的一部分。相反,实现应该使用 std::allocator_traits<Alloc>::rebind_alloc<U>
.
幸运的是,大多数容器通常允许将自定义分配器指定为模板参数。根据 docs,boost::bimap
也是如此,其中分配器可以是第三个、第四个或第五个模板参数。它默认为 std::allocator
,但可以使用 boost::container::allocator
,这不会产生错误:
#include <boost/bimap.hpp>
#include <boost/container/allocator.hpp>
int main() {
boost::bimap<int, int, boost::container::allocator<int>> lookup;
}
这个issue has recently been fixed in 6fba6e5。 boost::bimap
现在可以正确检测嵌套 ::rebind
是否可用:
template<class A, class T, class = void>
struct allocator_rebind {
typedef typename detail::alloc_to<A, T>::type type;
};
template<class A, class T>
struct allocator_rebind<A, T,
typename detail::alloc_void<typename A::template rebind<T>::other>::type> {
typedef typename A::template rebind<T>::other type;
};
使用 gcc 10.1 和 boost 1.73.0,以下代码
#include <boost/bimap.hpp>
int main() {
boost::bimap<int, int> lookup;
}
使用标志 -O2 --std=c++20
无法编译,但使用标志 -O2 -std=c++17
会成功(已通过编译器资源管理器验证)。
这可能与以下问题有关:https://github.com/boostorg/bimap/pull/15(已弃用 std::allocator<void>
)
我现在可以使用一些解决方法来使此代码成功编译 --std=c++20
吗?
错误背后的原因并不是 std::allocator<void>
专业化被 删除。实际上,作为带有 void
参数的主模板,它仍然有效。代码无法编译,因为 ::rebind
不再是 std::allocator
本身的一部分。相反,实现应该使用 std::allocator_traits<Alloc>::rebind_alloc<U>
.
幸运的是,大多数容器通常允许将自定义分配器指定为模板参数。根据 docs,boost::bimap
也是如此,其中分配器可以是第三个、第四个或第五个模板参数。它默认为 std::allocator
,但可以使用 boost::container::allocator
,这不会产生错误:
#include <boost/bimap.hpp>
#include <boost/container/allocator.hpp>
int main() {
boost::bimap<int, int, boost::container::allocator<int>> lookup;
}
这个issue has recently been fixed in 6fba6e5。 boost::bimap
现在可以正确检测嵌套 ::rebind
是否可用:
template<class A, class T, class = void>
struct allocator_rebind {
typedef typename detail::alloc_to<A, T>::type type;
};
template<class A, class T>
struct allocator_rebind<A, T,
typename detail::alloc_void<typename A::template rebind<T>::other>::type> {
typedef typename A::template rebind<T>::other type;
};