簡體   English   中英

std :: optional的值的地址是否穩定?

[英]Is the address of a std::optional's value stable?

假設我有一個std::optional<T> 我重置並多次賦值。 對於給定的可選值,值的地址(如果存在)是否始終相同?

換一種說法:

#include <cassert>
#include <optional>
#include <string>

template<typename T>
auto test()
{
    auto opt = std::optional<T>{T{}};
    auto* ptr = &*opt;

    opt.reset();
    opt = T{};

    assert(ptr == &*opt); // Can this assert fail?
}

int main()
{
    test<int>();
    test<double>();
    test<std::string>();
    // ...
}

標准是否保證了值的地址的穩定性?

標准是否保證了值的地址的穩定性?

從我的觀點來看, 未指明地址是否穩定。

形式上,標准僅保證std::optional中包含的對象沒有動態分配,並且包含對象存儲為std::optional的一部分:

23.6.3類模板可選[optional.optional]

任何給定時間的任何可選實例都包含值或不包含值。 當可選實例包含值時,意味着在可選對象的存儲中分配類型為T的對象(稱為可選對象的包含值)。 不允許實現使用額外的存儲(例如動態內存)來分配其包含的值。 包含的值應分配在可選存儲區域中,適合於類型T對齊。當可選類型的對象在上下文中轉換為bool時,如果對象包含值,則轉換返回true; 否則轉換返回false。

實際存儲機制由特定實現定義,因此,地址可能會發生變化。

但實際上,實現將使用像aligned_storage (參見boost 實現 )或union (如gcc 那樣 )之類的東西,並保持包含對象的地址相同。

暫無
暫無

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

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