簡體   English   中英

是否對std :: reference_wrapper的大小有任何保證?

[英]Is there any guarantee on the size of an std::reference_wrapper?

考慮這樣一種情況,即我有足夠的存儲空間來托管void * ,因此可以構建就地指針。
是否有任何保證相同的存儲空間足以始終存儲std::reference_wrapper

(寫出我的想法,只是為了理解我的意思):

std::aligned_storage_t<sizeof(void *), alignof(void *)> storage;
// ...
int value = 0;
new (&storage) std::reference_wrapper<int>{value};

從快速而骯臟的測試中,我發現在我的機器上這是有效的,即std::reference_wrapper的大小與void *的大小std::reference_wrapper 然而,在不同的平台上可能就是這種情況。 同時,我在標准中找不到關於std::reference_wrapper大小的任何線索,我想知道它是否已實現定義或有任何保證。


為了給出一個上下文,我正在開發一個圍繞不同類型(類似於std::any )的不透明包裝器,它執行一個小的對象優化以避免在可能的情況下進行分配。
當我收到一個std::reference_wrapper ,我想使用與用於區分sizeof(T) > sizeof(void *)路徑不同的路徑。 但是,我不知道我是否可以只在原地復制構造包裝器,或者在這種情況下我是否應該依賴於分配。

C ++標准沒有任何大小要求。 [refwrap]

  1. reference_wrapper<T>是圍繞對類型T的對象或函數的引用的Cpp17CopyConstructible和Cpp17CopyAssignable包裝器。
  2. reference_wrapper<T>是一種簡單的可復制類型。

我們所知道的只是可復制的,而且是微不足道的。 除此之外,還留給實施。 通常它只是T*的包裝器,但由於某種原因,實現中可能還有其他成員

標准中無法保證。

沒有明智的實現會使用多個指針。

static_assert它適合你,你有足夠的對齊,所以你的代碼是正確的(人們可以看到它是正確的)。 那個靜態斷言不會被擊中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM