相关疑难解决方法(0)

std :: optional作为union vs char []/aligned_storage实现

在阅读GCC的实现时,std::optional我发现了一些有趣的东西.我知道boost::optional实现如下:

template <typename T>
class optional {
    // ...
private:
    bool has_value_;
    aligned_storage<T, /* ... */> storage_;
}
Run Code Online (Sandbox Code Playgroud)

但是libstdc ++libc ++(以及Abseil)都实现了optional这样的类型:

template <typename T>
class optional {
    // ...
private:
    struct empty_byte {};
    union {
        empty_byte empty_;
        T value_;
    };
    bool has_value_;
}
Run Code Online (Sandbox Code Playgroud)

他们看起来因为它们在功能上是相同的,但使用一个优于另一个有什么优势吗?(除了明显缺乏后者的新位置,这真的很好.)

c++ placement-new unions c++17 stdoptional

9
推荐指数
2
解决办法
432
查看次数

标签 统计

c++ ×1

c++17 ×1

placement-new ×1

stdoptional ×1

unions ×1