如何解决编译时未检测到不正确的 std::pmr::polymorphic_allocator
我发现在编译类型中似乎没有正确检测到 pmr::polymorphic_allocator
类型。
我有类(例如 MyClass
),什么使用了 pmr::polymorphic_allocator
,并且这个分配器必须通过构造函数参数传递:
// file MyClass.hpp
#include <memory_resource>
class Item
{
// class members...
};
class MyClass
{
public:
explicit MyClass(std::pmr::polymorphic_allocator<Item> allocator)
{
// ....
}
// other members
};
然后,我正在尝试使用我的课程:
#include "MyClass.hpp"
#include <memory_resource>
// this compiles w/out errors - as expected
auto myClass1 = MyClass(std::pmr::polymorphic_allocator<Item>());
// and this compiles w/out errors too - as NOT expected
auto myClass2 = MyClass(std::pmr::polymorphic_allocator<OtherType>());
当然,OtherType
类型与 Item
类型完全不同。
所以,我在 MyClass
的构造函数中添加了一些额外的检查:
// file MyClass.hpp
#include <memory_resource>
#include <type_traits>
class Item
{
// class members...
};
class MyClass
{
public:
explicit MyClass(std::pmr::polymorphic_allocator<Item> allocator)
{
static_assert(std::is_same<Item,decltype(allocator)::value_type>::value,"Improper allocator!");
// ....
}
// other members
};
...并且仍然没有检测到不正确的分配器。 我找不到任何理由。有什么想法吗?
我的环境:GCC 10.2.0,CLion 2021.1
编辑:好的,我找到了原因。
pmr::polymorphic_allocator
具有转换构造函数,因此会发生到预期分配器的隐式转换:
constructor description on cppreference.com。
所以,似乎没有办法检测到不当分配器的使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。