微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

编译时未检测到不正确的 std::pmr::polymorphic_allocator

如何解决编译时未检测到不正确的 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 举报,一经查实,本站将立刻删除。