草庐IT

c++ - 防止对 std::unique_ptr 的不安全取消引用

摘自cppcon2015的幻灯片:unique_ptrf(){autoa=make_unique();returna;}//Whydoesthisevencompile?constA&dangling=*f();//BOOM!!!use(dangling);我的问题是:对于*this的右值引用,这可以解决吗?我在cppreference的规范中看到:typenamestd::add_lvalue_reference::typeoperator*()const;问题:不允许operator*用于右值unique_ptr并且只对左值unique_ptr取消引用有效吗?仍然有有效的用例来保持

c++ - 在 C++ std::multimap 上调用 .clear() 或 .erase() 有时会导致卡住(100% cpu)

我们使用多重映射来快速查找值/索引,声明如下typedefdoubleNumerical;std::multimapSortableRowIndex;然后我们用对填充它,使用SortableRowIndex.insert(std::pair(GetSortable(i),i));函数GetSortable()总是返回一个double值。这很好用。遍历这些值也可以正常工作。但奇怪的部分来了……有时当我们试图清除数据时……SortableRowIndex.clear();...它进入某种循环并停止/竞争,以100%占用CPU的已用内核。clear方法好像是继承自xtree(系统文件),里面

c++ - 在没有隐式转换的情况下在编译时检测运算符

我正在使用C++03methodtodetectthepresenceofafunctionatcompiletime.我必须使用此方法而不是void_t方法,即使我使用的是C++14,因为我必须支持GCC4.9,并且在使用void_t方法时出错(奇怪的是只有Ubuntu14的GCC4.9有这个问题,而不是Fedora的,但它已在GCC5+AFAICT中全面修复)。具体来说,我正在检查operator是否存在这样我就可以拥有一个pretty-print功能,可以接受任何类型。当函数被调用时,如果类型支持它,您会得到常规的ostream输出,并且当运算符未定义时,您会收到一条关于没有实现

c++ - 为什么C++标准要为std::bitset::reference指定一个析构函数?

我想知道为什么std::bitset::reference和std::vector::reference指定一个显式析构函数(不是编译器生成的析构函数)。因为,例如,boost::dynamic_bitset::reference似乎没有指定这样的析构函数。 最佳答案 只是因为标准提到了~reference()作为析构函数,并不意味着它必须作为空操作由用户提供{}(这就是libstdc++和SGI/STL的做法)。它也可以由用户声明为=default,甚至是隐式定义(libc++就是这样做的)。无论如何,可以更新标准以删除对析构函数

c++ - 如何使用删除函数按索引删除 std::vector<> 中的多个元素?

我有一个vectora存储值[01235]和其他vectorremovelist存储要删除的索引[012]以便在最后留下[35]。当我执行以下代码时,它会意外删除项目,因为vectora将在此过程中更改顺序。我有什么方法可以实现我的目标吗?for(inti=0;i 最佳答案 颠倒删除值的顺序,即使用removelist的反向迭代器。这当然依赖于removelist被排序。也许是这样的std::sort(removelist.begin(),removelist.end());//Makesurethecontainerissorte

c++ - 检查 std::fstream 是否处于写入或读取模式

我需要检查std::fstream是否以读和/或写模式打开文件。到目前为止,我找到了iosbase::openmode,但我认为我无法访问它。还有其他办法吗? 最佳答案 文件流不存储任何关于它们如何打开的信息,相应地,不能查询它们所处的模式。背景是流实现本身不需要信息,它需要存储不必要的数据。此外,在使用流时,通常很清楚它是读的还是写的:操作大不相同,使用表明使用了哪个操作。如果您真的需要获取此信息,我建议创建一个流类型,它在构造时使用std::filebuf设置std::iostream并将信息存储在pword()中,以便在将流作

c++ - 使用 std::weak_ptr 和别名构造函数打破循环引用:听起来还是有问题?

我还没有在任何主要的C++论坛/博客(例如GotW)上找到以下打破循环引用的方法,所以我想问一下该技术是否已知,其优缺点是什么?classNode:publicstd::enable_shared_from_this{public:std::shared_ptrgetParent(){returnparent.lock();}//thegetterfunctionsensurethat"parent"alwaysstaysalive!std::shared_ptrgetLeft(){returnstd::shared_ptr(shared_from_this(),left.get())

c++ - 使用 std::cin 时如何限制可见的用户输入?

我正在寻找一种使用std::cin限制可见用户输入的方法。#includeintmain(){std::cout>planet;//Duringtheprompt,only"accept"xcharacters}如果用户在按下enter之前输入earth或任何其他超过4个字符的单词,他们会看到什么:Enteryourplanet:eart假设字符限制为4,请注意缺少'h'。一旦超出字符限制,控制台将不再显示任何其他字符。这是在您按下回车键之前。有点像在输入框中输入密码字段,但它只允许5个字符,因此输入任何其他字符都不会被注意到更好的类比是HTML中文本输入的maxlength属性。

c++ - 如何通过id获取线程对象?

假设某个线程具有其他线程的std::thread::idmyId。现在我想检索与myId关联的std::thread对象,这样我就可以.join()它了。在std中有可能吗?还是我必须手动跟踪它? 最佳答案 如果可以避免,我不推荐这样做。即使在它可以工作的平台上,它也是一个糟糕的设计。我将其作为学术练习来满足好奇心。AFIK没有标准的方法来做到这一点。如果您不需要便携性并且您真的想要这样做......在某些平台上(例如Mac和可能的Linux)std::thread将只是底层pthread_t的包装器,因为它是相同的作为您已经拥有的

c++ - 将 std::error_code 与非整数值一起使用

我正在编写一个库,并希望在远程系统返回错误时返回错误代码。问题是它们由字符串标识,例如“0A01”,并且还包含一条消息,错误代码需要一个整数作为值。实现错误代码的最佳方法是什么,它具有std::error_code提供的所有功能,但使用字符串作为值?如何将外部错误字符串添加到std::error_code或std::error_category? 最佳答案 如评论中所述,您必须知道可以从远程服务器接收到的错误代码。您从远程服务器收到的std::string包含您所说的两部分,Theproblemisthattheseareident