- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
以下代码在 C++ 中是否合法?
template<typename T>
class Foo {
public:
Foo(T& v) : v_(v) {}
private:
T& v_;
};
int a = 10;
Foo<int> f(a);
void Bar(int& a) {
new (&f)Foo<int>(a);
}
引用不应该被绑定(bind)两次,对吧?
最佳答案
这是完全无效的。
[basic.life]/1,强调我的:
The lifetime of an object of type
T
ends when:
- if
T
is a class type with a non-trivial destructor (12.4), the destructor call starts, or- the storage which the object occupies is reused or released.
placement new 重用了存储,结束了 f
表示的对象的生命周期。
[basic.life]/7:
If, after the lifetime of an object has ended and before the storage which the object occupied is reused or released, a new object is created at the storage location which the original object occupied, a pointer that pointed to the original object, a reference that referred to the original object, or the name of the original object will automatically refer to the new object and, once the lifetime of the new object has started, can be used to manipulate the new object, if:
- the storage for the new object exactly overlays the storage location which the original object occupied, and
- the new object is of the same type as the original object (ignoring the top-level cv-qualifiers), and
- the type of the original object is not const-qualified, and, if a class type, does not contain any non-static data member whose type is const-qualified or a reference type, and
- the original object was a most derived object (1.8) of type
T
and the new object is a most derived object of typeT
(that is, they are not base class subobjects).
由于不满足第三个要点,调用Bar
后,f
不引用placementnew
创建的对象>,但对于以前存在的不再存在的对象,并尝试使用它会导致未定义的行为。
关于c++ - 使用 placement new 更新引用成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33514809/
我看过一些 placement new 的例子,但对各种类型内部发生的事情有点困惑。 一个简单的例子: using my_type = std::string; using buffer_
需要帮助在 Hibernate 继承中实现此场景 Cow 和 Dog 继承 Animal 类, 牛和狗都有“后代”名单 牛有额外的 list - 每月疫苗接种日期 这个 Hibernate 表示方式正
背景 我正在开发一个嵌入式 C++ 项目,在该项目中我正在使用继承构建一个简单的状态机。这个想法是每个状态都将继承自一个名为 State 的基类,状态管理器将在状态转换期间创建和销毁子类实例。为了避免
这里有没有人使用过C++的“placement new”?如果是这样,那是为了什么?在我看来,它仅在内存映射的硬件上有用。 最佳答案 新的Placement允许您在已分配的内存中构造一个对象。 当您需
我一直在阅读一些关于 placement new on SO 的问题,我发现了一些不同的使用方法,我想我会在这里问一下。我知道 placement new 基本上是您创建对象并在您选择的已分配内存中为
我正在通过以下代码学习新的 C++ 布局。 class Cell { public: Cell() { printf("default constructor by %s\n"
#include #include struct A { int a; }; struct B : virtual A { int b; }; struct C : virtual A { in
我刚刚发现了一些用 C++ 实现的容器。该类使用内部缓冲区来管理其对象。这是一个没有安全检查的简化版本: template class Container { public: Containe
是否有一种模式可以在退出范围时自动调用堆栈上 placement-new 初始化对象的析构函数?我想跳过内存显式调用析构函数的需要。或者,是否有一种不同于 placement-new 的方法来构建具有
在 Android Activity 上,我想将图像设置为左下角的背景。操作方法如下:Background Image Placement 但是,我还希望能够指定不是该图像的其余背景具有特定颜色。这可
这里有人用过C++的“placement new”吗?如果是这样,为什么?在我看来它只对内存映射硬件有用。 最佳答案 Placement new 允许您在已分配的内存中构造一个对象。 当您需要构造一个
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
假设我有一个 MyStack 类公开了: class MyStack { public: template T* Push() { Reserve(sizeof(T)); // Make s
这里有人用过C++的“placement new”吗?如果是这样,为什么?在我看来它只对内存映射硬件有用。 最佳答案 Placement new 允许您在已分配的内存中构造一个对象。 当您需要构造一个
这里有人用过C++的“placement new”吗?如果是这样,为什么?在我看来它只对内存映射硬件有用。 最佳答案 Placement new 允许您在已分配的内存中构造一个对象。 当您需要构造一个
我正在创建一个受歧视的类 union 体。我使用的是 c++ 17,所以我可以在技术上使用 std::variant,但由于特定的用例,我希望每个变体的含义更加明确(特别是因为其中两种情况没有数据,除
尝试使用 placement new 但它一直给我错误。我记得不久前,它正在工作。 g++(版本 4.8.4)在 Ubuntu 14.04 上。 #include typedef unsigned
这里有人用过C++的“placement new”吗?如果是这样,为什么?在我看来它只对内存映射硬件有用。 最佳答案 Placement new 允许您在已分配的内存中构造一个对象。 当您需要构造一个
这个问题在这里已经有了答案: What uses are there for "placement new"? (25 个答案) 关闭 8 年前。 我有两个使用new运算符分配内存的案例。 clas
我有一 block 内存区域,将用于多个队列。比如我分配了1024字节的内存,需要两个队列。第一个队列将占用前 512 个字节,第二个队列将占用接下来的 512 个字节。 但是,我的队列由 C++ 类
我是一名优秀的程序员,十分优秀!