P0137引入了函数模板, std::launder并在有关联合,生命周期和指针的部分中对标准进行了许多更改.
这篇论文解决了什么问题?我必须注意哪些语言的变化?我们在做什么launder?
有时重新开始很好.在C++中,我可以使用以下简单的操作:
{
T x(31, Blue, false);
x.~T(); // enough with the old x
::new (&x) T(22, Brown, true); // in with the new!
// ...
}
Run Code Online (Sandbox Code Playgroud)
在范围的最后,析构函数将再次运行,一切似乎都很好.(我们也说T有点特别,不喜欢被分配,更不用说交换了.)但有些东西告诉我,摧毁一切并再试一次并不总是没有风险.这种方法有可能存在吗?
有两个关于替换不可赋值的向量元素的问题:
对象不可分配的典型原因是其类定义包含const成员,因此将其operator=删除.
std::vector要求其元素类型可分配.事实上,至少使用GCC,当对象不可分配时,直接赋值(vec[i] = x;),erase()以及insert()替换元素的组合都不起作用.
可以使用像下面这样的函数来使用vector::data(),直接元素销毁和使用复制构造函数的新元素来替换元素而不会导致未定义的行为吗?
template <typename T>
inline void replace(std::vector<T> &vec, const size_t pos, const T& src)
{
T *p = vec.data() + pos;
p->~T();
new (p) T(src);
}
Run Code Online (Sandbox Code Playgroud)
下面是一个使用函数的例子.这在GCC 4.7中编译并且似乎有效.
struct A
{
const int _i;
A(const int &i):_i(i) {}
};
int main() {
std::vector<A> vec;
A c1(1);
A c2(2);
vec.push_back(c1);
std::cout << vec[0]._i << std::endl;
/* To replace the element …Run Code Online (Sandbox Code Playgroud) 假设我有一个这样的类:
#include <new>
struct thing {
thing() = default;
void foo()
{
this->~thing();
new (this) thing();
}
};
Run Code Online (Sandbox Code Playgroud)
是这样调用析构函数然后使用放置新定义的行为重建对象?
c++ ×4
c++-faq ×1
c++11 ×1
c++17 ×1
destructor ×1
memory ×1
new-operator ×1
std ×1
stdlaunder ×1
vector ×1