这是什么技术问题std::shared_ptr::unique()是它在C++ 17中被弃用的原因?
根据cppreference.com,std::shared_ptr::unique()在C++ 17中被弃用
从C++ 17开始不推荐使用此函数,因为
use_count它只是多线程环境中的近似值.
我理解这是真的use_count() > 1:虽然我拿着它的引用,但其他人可能会同时放弃他或创建一个新副本.
但是如果use_count()返回1(这是我在调用时感兴趣的话unique())那么就没有其他线程可以以一种活泼的方式改变这个值,所以我希望这应该是安全的:
if (myPtr && myPtr.unique()) {
//Modify *myPtr
}
Run Code Online (Sandbox Code Playgroud)
我发现这个文件:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0521r0.html建议弃用以回应C++ 17 CD评论CA 14,但我找不到评论本身.
作为替代方案,该文件建议增加一些说明,包括以下内容:
注意:当多个线程可以影响返回值时
use_count(),结果应视为近似值.特别是,use_count() == 1并不意味着通过先前破坏的访问shared_ptr在任何意义上都已完成. - 结束说明
我理解这可能use_count()是当前指定方式的情况(由于缺乏保证的同步),但为什么分辨率不仅仅是指定这样的同步并因此使上述模式安全?如果有一个基本的限制,不允许这种同步(或使其成本高昂),那么如何才能正确实现析构函数?
我忽略了@ alexeykuzmin0和@rubenvb提出的明显案例,因为到目前为止我只unique()在shared_ptr其他线程本身无法访问的实例上使用过.因此,没有任何危险,特定的实例将以一种活泼的方式被复制.
我仍然有兴趣了解CA 14究竟是什么,因为我相信unique()只要保证与shared_ptr其他线程上的不同实例发生的任何事情同步,我的所有用例都会起作用.所以它对我来说似乎仍然是一个有用的工具,但我可能会忽略一些基本的东西.
为了说明我的想法,请考虑以下事项:
class MemoryCache {
public:
MemoryCache(size_t size)
: …Run Code Online (Sandbox Code Playgroud) 给出以下代码:
#include <iostream>
template <std::size_t N>
struct foo
{ static std::size_t value; };
template <>
std::size_t foo<0>::value = 0u;
template <size_t N>
std::size_t foo<N>::value = 1u + foo<N - 1u>::value;
int main()
{
std::cout
<< foo<3u>::value << ' '
<< foo<2u>::value << ' '
<< foo<1u>::value << ' '
<< foo<0u>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在递归地初始化value模板结构的静态成员的地方foo,我从g ++得到了不同的输出:
3 2 1 0
Run Code Online (Sandbox Code Playgroud)
和从c ++++:
1 1 1 0
Run Code Online (Sandbox Code Playgroud)
看来g ++ foo<N>::value使用foo<N-1u>::valueclang ++对0使用零的初始化值来递归初始化foo<N-1u>::value。
两个问题: …
我想用来fstream读取txt文件.
我正在使用inFile >> characterToConvert,但问题是这省略了任何空格和换行符.
我正在编写加密程序,所以我需要包含空格和换行符.
什么是实现这一目标的正确方法?
谁能帮助我了解是否有一个很大的区别!=,并<当谈到谈论内矢量迭代for循环?
我的意思是,无论你使用!=和<,结果应该是一样的吗?
for (vector<int>::iterator i = vec.begin(); i != vec.end(); i++)
// DO STUFF
Run Code Online (Sandbox Code Playgroud)
for (vector<int>::iterator i = vec.begin(); i < vec.end(); i++)
// DO STUFF
Run Code Online (Sandbox Code Playgroud)
我知道最常用的方法是使用!=,但<如果使用会是一个大问题吗?
在最近的一次代码审查中,有人声称
在选择系统上,
calloc()可以分配超过SIZE_MAX总字节数,但是malloc()有限.
我的主张是错误的,因为calloc()为一个对象数组创建了空间 - 作为一个数组,它本身就是一个对象.没有任何物体的尺寸可以大于SIZE_MAX.
那么我们哪个是正确的?在地址空间大于范围的(可能是假设的)系统上size_t,calloc()当使用产品大于SIZE_MAX?的参数调用时,是否允许成功?
为了使它更具体:以下程序是否会以非零状态退出?
#include <stdint.h>
#include <stdlib.h>
int main()
{
return calloc(SIZE_MAX, 2) != NULL;
}
Run Code Online (Sandbox Code Playgroud) 我的班级明确转换为bool:
struct T {
explicit operator bool() const { return true; }
};
Run Code Online (Sandbox Code Playgroud)
我有一个例子:
T t;
Run Code Online (Sandbox Code Playgroud)
要将它分配给类型的变量bool,我需要编写一个强制转换:
bool b = static_cast<bool>(t);
bool b = bool(t);
bool b(t); // converting initialiser
bool b{static_cast<bool>(t)};
Run Code Online (Sandbox Code Playgroud)
我知道我可以在没有强制转换的条件下直接使用我的类型,尽管有explicit限定符:
if (t)
/* statement */;
Run Code Online (Sandbox Code Playgroud)
我还可以t在bool没有演员阵容的情况下使用?
是否可以通过使用移动语义将临时std :: map的内容插入temp到另一个std :: map中m,以便临时值不被复制并重用?
让我们说有一个:
std::map<int, Data> temp;
std::map<int, Data> m;
Run Code Online (Sandbox Code Playgroud)
从复制值的一种方法temp为m是:
m.insert(temp.begin(),temp.end());
Run Code Online (Sandbox Code Playgroud)
我怎样才能移动的temp元素融入m,而不是复制?
在C++ 11中,我正在使用它
typeid(T).name()
Run Code Online (Sandbox Code Playgroud)
对于我自己的哈希计算.我不需要在程序运行或编译之间使结果相同.我只需要它对于类型是唯一的.我知道,它可以为不同类型的返回相同的名称,但它通常是常量,指针等.在我的情况下,T仅仅是class XY,struct XX或派生类型.
在这种情况下,我可以假设,这T将是独一无二的吗?
C++ 17将按值添加此对象的副本捕获,捕获规范为[*this].
这有用吗?它与捕获this有何不同?这不可能在C++ 14中实现[tmp = *this]吗?
用于解释为什么P0018R3使用[=, tmp = *this]而不是[tmp = *this]在他们的示例中的奖金.如果他们使用过[tmp = *this],那么C++ 14解决方案的所有列出的缺点都将被消除.
我正在阅读,我看到以下代码:
template <>
inline bool is_empty(const char* const& x)
{
return x==0 || *x==0;
}
Run Code Online (Sandbox Code Playgroud)
什么const char* const& x意思?
我尝试了以下代码来理解它:
void f(const char* const& x)
{
// whatever
}
void main()
{
char a = 'z';
char &j = a;
f(a);//error
f(*a);//error
f(&a);//fine
f(j);//error
f(&j);//fine
f('z');//error
}
Run Code Online (Sandbox Code Playgroud)
它仅适用于f(&a)和f(&j).
究竟const char* const& x是什么意思?