2017-08-23 70 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

相關問題