小编has*_*rsn的帖子

std :: move into static_pointer_cast:为什么static_pointer_cast没有rvalue引用重载?

假设我们有一个函数,期望按值共享指针.(在现实生活中的例子中,我通过右值引用将其转发给成员.)

void f(std::shared_ptr<Derived> ptr) { ... }
Run Code Online (Sandbox Code Playgroud)

但是我们只有一个指向基类的共享指针,所以我们使用static_pointer_cast:

std::shared_ptr<Base> ptr = std::make_shared<Derived>();
f(std::static_pointer_cast<Derived>(ptr));
Run Code Online (Sandbox Code Playgroud)

第一个赋值(从临时构造ptr)是触发引用计数的原子递增和递减还是共享指针移动?(注意它正在升级.)

在内部static_pointer_cast有一个引用计数的原子增量.如果我们不再需要ptr,我们希望将其移入f.但由于没有超载static_pointer_cast参与右值参考,此举不会产生任何影响:

f(std::static_pointer_cast<Derived>(std::move(ptr)));
Run Code Online (Sandbox Code Playgroud)

一旦ptr被破坏,我们仍然有原子增量和相应的原子减量.为什么没有这样的超负荷?

c++ c++11

6
推荐指数
1
解决办法
440
查看次数

运算符<(小于)指针是否一致?

注意:这个问题与总订单无关.可以使用获得相同类型的指针的总顺序std::less.

据此,如果将两个指针指向operator<不同的分配,则不允许比较两个指针.

它在哪种意义上是不允许的?是实现定义,未指定还是未定义的行为?

我想我在某个地方看到它没有说明.不需要实现来记录行为是什么,但必须有一些行为.所以这意味着,比较任何两个指针仍然是合法的,但不一定会产生总订单.这是否意味着,当两次比较相同的两个指针时,我们仍然必须得到一致的结果?一般情况是:在应用程序中两次调用相同的未指定行为总是会产生相同的结果吗?

int i1, i2;
int* a = &i1;
int* b = &i2;
bool b1 = a < b; // unspecified, right?
bool b2 = a < b;
assert(b1 == b2); // Is this guaranteed to be true?
Run Code Online (Sandbox Code Playgroud)

c++ pointers

5
推荐指数
1
解决办法
522
查看次数

使用"using"语法修复大小的数组别名

考虑以下typedef:

typedef int int_array_of_size_4[4];
Run Code Online (Sandbox Code Playgroud)

有没有与更新的"使用"语法等效?如果是,那是什么?

编辑:这不是这个问题的重复,因为那是关于别名未知界限的数组.

c++

3
推荐指数
1
解决办法
189
查看次数

为什么函数声明在C++中有const参数?

请考虑以下函数声明:

void foo(const int);
Run Code Online (Sandbox Code Playgroud)

此功能具有签名void(int).它可以定义如下:

void foo(int) {}
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为参数在函数体内是否为const对调用者来说无关紧要.但是,为什么我们甚至允许在函数声明中编写const参数?

编辑:这不是这个问题的重复.在该问题中,const已添加到函数定义中的参数中.他们没有讨论const函数声明中的参数.

c++

2
推荐指数
1
解决办法
106
查看次数

标签 统计

c++ ×4

c++11 ×1

pointers ×1