假设我们有一个函数,期望按值共享指针.(在现实生活中的例子中,我通过右值引用将其转发给成员.)
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被破坏,我们仍然有原子增量和相应的原子减量.为什么没有这样的超负荷?
注意:这个问题与总订单无关.可以使用获得相同类型的指针的总顺序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) 考虑以下typedef:
typedef int int_array_of_size_4[4];
Run Code Online (Sandbox Code Playgroud)
有没有与更新的"使用"语法等效?如果是,那是什么?
编辑:这不是这个问题的重复,因为那是关于别名未知界限的数组.
请考虑以下函数声明:
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函数声明中的参数.