[英]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.