使用push_back时std::vector,我可以推送向量本身的元素,而不必担心因重新分配而使参数无效:
std::vector<std::string> v = { "a", "b" };
v.push_back(v[0]); // This is ok even if v.capacity() == 2 before this call.
Run Code Online (Sandbox Code Playgroud)
但是,在使用时emplace_back,std::vector将参数转发给构造函数,std::string以便复制构造在向量中发生.这使我怀疑向量的重新分配在新字符串被复制构造之前发生(否则它不会被分配到位),从而在使用之前使参数无效.
这是否意味着我无法添加向量本身的元素emplace_back,或者在重新分配的情况下是否有某种保证,类似于push_back?
在代码中:
std::vector<std::string> v = { "a", "b" };
v.emplace_back(v[0]); // Is this valid, even if v.capacity() == 2 before this call?
Run Code Online (Sandbox Code Playgroud) 我有整数值,用于访问不相关的数据存储中的数据,即句柄.我已选择将整数包装在结构中以便具有强类型对象,以便不能混合不同的整数.他们是,而且必须是POD.这就是我正在使用的:
struct Mesh {
int handle;
};
struct Texture {
int handle;
};
Run Code Online (Sandbox Code Playgroud)
我有这些句柄的数组,例如:Texture* textureHandles;.
有时我需要传递一个句柄数组int*来代码更通用的部分.现在我正在使用:
int* handles = &textureHandles->handle;
Run Code Online (Sandbox Code Playgroud)
它本质上是一个指向结构的第一个元素的指针,并将其解释为一个数组.
我的问题基本上是,如果这是合法的,或者如果它违反严格的别名来操纵int* handles和Texture* textureHandles指向同一个内存.我认为这应该是允许的,因为int在两种情况下都以相同的方式访问底层的type().我的保留与我通过获取一个结构中的成员的地址访问多个结构的事实有关.
作为我的第一个问题的延伸,以下是否可以?
int* handles = reinterpret_cast<int*>(textureHandles);
Run Code Online (Sandbox Code Playgroud) 我有一个消息系统,我将结构传递给不同的函数.在一个精简的例子中,消息描述如下:
struct Message {
bool wasHandled;
Message() {
wasHandled = false;
}
};
Run Code Online (Sandbox Code Playgroud)
并调用消息处理程序,如下所示:
handleMessage(Message());
Run Code Online (Sandbox Code Playgroud)
消息作为const引用传递.我的主要动机是,我可以写上面的单行.如果通过非const引用传递,我将不得不写:
Message message;
handleMessage(message);
Run Code Online (Sandbox Code Playgroud)
handle标志指示消息是否由函数处理.handleMessage因此该功能需要修改wasHandled标志.一种可能的实现方式是:
void handleMessage(const Message& message) {
const_cast<bool&>(message.wasHandled) = true;
// Do stuff here.
}
Run Code Online (Sandbox Code Playgroud)
但是,根据我的理解,
handleMessage(Message());
Run Code Online (Sandbox Code Playgroud)
相当于:( 注意:这是不正确的,请参阅接受的答案)
const Message message;
handleMessage(message);
Run Code Online (Sandbox Code Playgroud)
因此我正在改变const对象的值.这是未定义的行为.
将该消息声明为
struct Message {
mutable bool wasHandled;
Message() {
wasHandled = false;
}
};
Run Code Online (Sandbox Code Playgroud)
让它定义行为?这当然也会删除const cast.
请注意,在此特定示例中,wasHandle标志实际上从未被读取,并且如果调用者想要知道它,则不能使用单行.但是,实际上并非所有来电者都对旗帜感兴趣.消息也可能被分派到handleMessage使用该标志的其他函数内部.