小编Tob*_*ght的帖子

为什么不赞成使用std :: shared_ptr :: unique()?

这是什么技术问题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)

c++ multithreading shared-ptr c++17

31
推荐指数
2
解决办法
3466
查看次数

g ++和clang ++的不同行为与静态成员的递归初始化

给出以下代码:

#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

两个问题: …

c++ recursion templates static-members language-lawyer

31
推荐指数
1
解决办法
1763
查看次数

使用fstream读取包含空格和换行符在内的每个字符

我想用来fstream读取txt文件.

我正在使用inFile >> characterToConvert,但问题是这省略了任何空格和换行符.

我正在编写加密程序,所以我需要包含空格和换行符.

什么是实现这一目标的正确方法?

c++ fstream newline spaces

30
推荐指数
4
解决办法
7万
查看次数

矢量迭代器<或!=

谁能帮助我了解是否有一个很大的区别!=,并<当谈到谈论内矢量迭代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)

我知道最常用的方法是使用!=,但<如果使用会是一个大问题吗?

c++ iterator vector

30
推荐指数
3
解决办法
2494
查看次数

calloc()总共可以分配超过SIZE_MAX吗?

最近的一次代码审查中,有人声称

在选择系统上,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)

c language-lawyer

30
推荐指数
2
解决办法
2306
查看次数

我什么时候可以使用显式运算符bool而无需强制转换?

我的班级明确转换为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)

我还可以tbool没有演员阵容的情况下使用?

c++ implicit-conversion

29
推荐指数
1
解决办法
6303
查看次数

我可以移动 - 将std :: map的内容分配到另一个std :: map中吗?

是否可以通过使用移动语义将临时std :: map的内容插入temp到另一个std :: map中m,以便临时值不被复制并重用?

让我们说有一个:

std::map<int, Data> temp;
std::map<int, Data> m;
Run Code Online (Sandbox Code Playgroud)

从复制值的一种方法tempm是:

m.insert(temp.begin(),temp.end());
Run Code Online (Sandbox Code Playgroud)

我怎样才能移动temp元素融入m,而不是复制?

c++ move-semantics c++11

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

C++ 11 - typeid唯一性

在C++ 11中,我正在使用它

typeid(T).name()
Run Code Online (Sandbox Code Playgroud)

对于我自己的哈希计算.我不需要在程序运行或编译之间使结果相同.我只需要它对于类型是唯一的.我知道,它可以为不同类型的返回相同的名称,但它通常是常量,指针等.在我的情况下,T仅仅是class XY,struct XX或派生类型.

在这种情况下,我可以假设,这T将是独一无二的吗?

c++ typeid c++11

27
推荐指数
3
解决办法
3703
查看次数

C++ 17 lambda capture*this

C++ 17将按值添加此对象的副本捕获,捕获规范为[*this].

这有用吗?它与捕获this有何不同?这不可能在C++ 14中实现[tmp = *this]吗?


用于解释为什么P0018R3使用[=, tmp = *this]而不是[tmp = *this]在他们的示例中的奖金.如果他们使用过[tmp = *this],那么C++ 14解决方案的所有列出的缺点都将被消除.

c++ lambda c++-faq c++17

27
推荐指数
2
解决办法
3289
查看次数

指针参考

我正在阅读,我看到以下代码:

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是什么意思?

c++

26
推荐指数
3
解决办法
8703
查看次数