2017-08-23 69 views
2

std :: variant有一个uses_allocator的专门化,但不适用于std :: optional。为什么?为什么没有std :: uses_allocator <std :: optional>?

+1

也许因为['std :: optional'](http://en.cppreference.com/w/cpp/utility/optional)不能通过[allocator]创建(http://en.cppreference .com/w/cpp/concept/Allocator),但['std :: variant'](http://en.cppreference.com/w/cpp/utility/variant)可以吗? –

回答

0

Standard 23.6.3.1

实现不允许使用额外的存储器,比如动态存储器,分配其包含的值。

所以没有必要为一个分配器。

虽然同样是变体23.7.3.1真:

实现不允许使用额外的存储器,比如动态存储器,以分配所包含的值。

显然,uses_allocator专业化为std::variantwas removed for C++17(HT:!@ K-BALLO)。

0

由于

如果任选包含一个值,该值被保证是 分配为可选的对象足迹部分,即没有动态 存储器分配曾经发生。因此,即使已定义运算符*()和运算符 - >() ,可选对象也会模拟一个对象,而不是指针。

http://en.cppreference.com/w/cpp/utility/optional

在另一方面,用于支持分配器在标准的早期版本std::variant,所以我感觉这种专业化是当年的遗迹。

+0

变体不会分配内存。 – draganm17

+0

@ draganm17我有一种不被支持的感觉,认为这是由于变体的原始实现而导致的。 – SergeyA

相关问题