比方說,我們有一個變量是否有可能在std ::可選w/o中放置一個實例來檢查/破壞前一個實例?
std::optional<T> x;
std::optional<T>
類型的某種類型的T
。 如果我想在x
中調用T
的構造函數並初始化它,我可以調用成員函數std::optional::emplace
。據我所知,這個成員函數檢查實例是否已經存在(即bool(x)
求值爲true
),如果是這種情況,它首先銷燬先前構造的實例,然後使用提供的構造函數和參數重新初始化它。
我想知道是否有可能做只有初始化W/O檢查和銷燬。在處理std::optional
時,首先檢查實例是否存在,然後根據結果做一些單獨的工作似乎很常見。因此,似乎有理由認爲,當我們需要在std::optional
內部放置一個實例時,我們已經知道它不包含任何已初始化的實例。因此,提供std::optional::emplace
的「不安全版本」似乎是合理的,它不檢查和銷燬先前的實例,但std::optional
不具有這樣的成員函數。有什麼辦法可以做到這一點?
也許,如果有關於內存佈局std::optional
一些擔保(我想不會),那麼我可以呼叫部署new
運營商直接...
我希望一個體面的優化編譯器將能夠刪除這些無用的檢查。您是否在優化之後檢查此檢查是否仍然存在? – JVApen
@JVApen看起來經常是這樣,但並非總是如此,特別是當在另一個函數(編譯器未能內聯)中完成構造時。 –
你是否已經嘗試添加斷言是空的? – JVApen