【发布时间】:2018-02-03 19:11:54
【问题描述】:
假设我有一个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>();
// ...
}
标准是否保证值地址的稳定性?
【问题讨论】:
-
标准相关部分:eel.is/c++draft/optional
-
我没有看到任何需要对象保持在同一位置的东西,也就是说,似乎符合要求的实现可能具有
sizeof(std::optional<T>) >= 2*sizeof(T)并移动对象的位置。但是没有一个理智的实现会这样做 -
@Justin 感谢您的链接!实际上,我想在某处存储指向该值的指针(C 库需要我的值的地址)。当 C 库访问指针时,我可以确保可选项确实具有价值。 “没有理智的实施”说得很好:-)
-
这不是在对象的生命周期结束后检查其地址吗?
标签: c++ language-lawyer std c++17