这会导致访问unique_ptr时出现分段错误-
这里的订货不保证吗?
#include <iostream>
#include <memory>
#include <unordered_map>
class D
{
private:
int id_;
public:
D(int id) : id_{id} { std::cout << "D::D\n"; }
~D() { std::cout << "D::~D\n"; }
int get_id() { return id_; }
void bar() { std::cout << "D::bar\n"; }
};
int main() {
std::unordered_map<int, D*> obj_map;
auto uniq_ptr = std::make_unique<D>(123);
obj_map[uniq_ptr->get_id()] = uniq_ptr.release();
obj_map.at(123)->bar();
return 0;
}
这是因为[expr.ass]/1指出:
[...] 在所有情况下,赋值都是在右操作数和左操作数的值计算之后、赋值表达式的值计算之前排序的。右操作数在左操作数之前排序。对于顺序不确定的函数调用,复合赋值的操作是一次计算。
强调我的
根据上面的描述,首先计算右手边,然后计算左手边,然后进行赋值。需要注意的是,这只在C17之后才有保证。在C17之前,左右侧评估的顺序尚未确定。
它实际上保证了这段代码总是会失败。
根据cplike:
换句话说:在您的情况下,保证在get_id()
之前调用。
问题内容: 我只是编写了一个示例程序来查看 删除此文件* 的行为 * 问题 在fun()中执行 删除操作 后,如何在fun()中使用此指针访问func_2()? 现在主要在删除该指针时如何执行 obj- > fun_2? 如果在杀死该对象后能够访问函数成员,那么为什么数据成员的数据为零‘0’? m使用linux ubuntu和g ++编译器 问题答案: 让我们将其与类似的szenario进行比较:
因此,我在尝试Java中的一些基本封装时发现,从扩展类内部访问成员和函数的方式是不同的。我想说的是: 在上面的例子中,对于当前类的对象(扩展超级类的对象),在访问超级类的成员的同时调用当前类的方法。那么,这是什么原因呢?或者,更笼统地说,当我说 我是说,在记忆层面发生了什么?
我想在我的对象中编写一个实用函数指针,用于调用该对象中的一组其他函数。此实用程序函数指针应使用默认功能初始化,但也可以重写。 这就是我到目前为止所做的: 编译器不喜欢在捕获lambda函数时使用,并针对该行抛出以下错误: E0413-没有来自“lambda[]void()的合适转换函数- C2440“正在初始化”:无法从“游戏状态::”转换为“void(uu cdecl*)(void)” C243
我创建了Angular2 Typescript项目。我有很多表格,所以我想有一个类似基本组件的东西。 这是我的基本组件: 现在有我的子组件。我想从http获取所有项目,然后将其分配给基类 知道如何从订阅方法访问基字段吗?
本文向大家介绍什么是C#中的静态成员函数?,包括了什么是C#中的静态成员函数?的使用技巧和注意事项,需要的朋友参考一下 静态函数只能访问静态变量。静态函数甚至在创建对象之前就已存在。 将静态函数设置为- 以下是演示静态函数用法的示例- 示例 输出结果
注意:如果friend函数只是在类中声明并在外部实现,那么Clang和GCC都会拒绝该代码。