草庐IT

c++ - 为什么 gcc 警告使用 std::tuple 和虚拟继承调用非平凡的移动赋值运算符?

在下面的例子中,gcc7给出了警告:defaultedmoveassignmentfor'B'callsanon-trivialmoveassignmentoperatorforvirtualbase'A'[-Wvirtual-move-assign]如果我创建一个std::tuple目的。Clang5没有报告任何问题。如果vector,问题也会消失从Base中删除.Example.#include#includeclassBase{public:virtual~Base();std::vectorv;};classA:publicBase{};classB:publicvirtual

c++ - std::promise 外部代码,异步取消

假设您有一些无法修改的外部同步代码,您要求它异步运行,但也要求它是可取消的。如果外部代码阻塞,那么我有两个选择。A)欺骗用户并让我的异步方法在取消时立即返回,清楚地知道代码仍在某处运行完成。B)取消执行我想为选项B实现一个接口(interface)namespaceexternallib{std::uint64_ttimeconsuming_operation(){std::uint64_tcount=0;for(autoi=0;istructasync_operation{structCancelledOperationException{std::stringwhat()const

c++ - std::promise<void> 抛出未知错误,除非调用 sleep

我有这个代码:#include#includeintmain(){std::promisep;p.set_value();p.get_future().get();return0;}用gcc编译后抛出std::system_error:$g++-ofoofoo.cpp-std=c++11-lpthread$./footerminatecalledafterthrowinganinstanceof'std::system_error'what():Unknownerror-1奇怪的是,在创建promise之前添加零秒sleep,防止了异常:intmain(){std::this_thre

c++ - std::chrono::duration 的运算符/和带有 clang 的自定义类型

考虑一个自定义类型,它用于乘除持续时间的特定实例:#include#includeclassFoo{};usingDuration=std::chrono::seconds;inlineDurationoperator*(Durationd,Foo){std::cout此代码使用gcc编译时没有警告,但使用clang(wandbox)时失败Infileincludedfromprog.cc:1:/opt/wandbox/clang-7.0.0/include/c++/v1/chrono:1259:81:error:notypenamed'type'in'std::__1::common

c++ - 为什么 std::get 不适用于变量?

我在理解函数(尤其是模板函数和局部变量)在编译期间的行为时遇到了麻烦。因此这段代码适用于std::get:enumclassUserInfoFields{name,email,address};usingUserInfo=std::tuple;intmain(){UserInfos{"Edmund","edmund@page.me","Denverstreet19"};std::cout(UserInfoFields::name)>(s)据我了解这是因为std::get是一个模板函数,它需要在编译期间知道一个模板参数。这是有道理的static_cast在编译期间给我们值。我不明白,如果

c++ - 在 C++ 中,std::multiset 是否保持稳定的排序顺序?

假设我有两个比较相同的项目a和b。所以a我查了几个引用资料,但找不到答案。我很想认为没有任何保证,这取决于每个特定的实现。谢谢。 最佳答案 Thisthread暗示当前标准不保证它,但所有已知的当前实现都满足它,并提供指向包含保证的C++0x标准草案的链接。 关于c++-在C++中,std::multiset是否保持稳定的排序顺序?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/

c++ - 变体 bstr 到 std::string 转换的默认编码

我有一个从MSXMLDOM中提取的变体bstr,所以它是UTF-16格式的。我试图找出此转换发生的默认编码:VARIANTvtNodeValue;pNode->get_nodeValue(&vtNodeValue);stringstrValue=(char*)_bstr_t(vtNodeValue);根据测试,我认为默认编码是Windows-1252或Ascii,但我不确定。顺便说一句,这是我正在修复并将变体转换为wstring并通过调用WideCharToMultiByte进行多字节编码的代码块。谢谢! 最佳答案 operator

c++ - 在 std::map 中使用(数学) vector

相关:whatcanIuseasstd::mapkeys?我需要创建一个映射,将空间中的特定关键位置映射到对象列表。std::map似乎是这样做的方法。所以我输入了std::map在xyz上VectorclassVector{floatx,y,z};,我正在制作std::map>.所以请注意这里的key不是std::vector,它是classVector的一个对象这只是我自己制作的数学xyzvector。为了产生“严格弱排序”,我为operator编写了以下重载:boolVector::operator=b.yreturnfalse;}}else{//z>=b.zreturnfals

c++ - Eclipse 内容辅助无法识别 std::thread,但可以正确编译

我正在运行Ubuntu14.04。我重现的步骤:创建一个新的C++项目(新建->C++->HelloWorld项目),我将其命名为TestStdThread将主文件中的代码更改为:#include#includeintmain(){std::cout转到TestStdThread->Properties->C/C++Build->Settings->GCCC++Compiler,并将Command选项从g++更改为g++-std=c++11转到TestStdThread->Properties->C/C++Build->Settings->GCCC++Compiler->Include

c++ - 使用 std::swap 而不是使用 '=' 运算符进行赋值

我正在查看一些C++源代码fromalibrary与我正在从事的宠物项目有关,遇到了一些我不明白的事情。在我期望指针取消引用然后赋值的地方,库作者在函数末尾附近使用std::swap()来写入结果:std::swap(*out,result);我希望看到这样的东西:*out=result;请注意,result是size_t的typedef,out是指向同一类型的指针。当谈到“系统编程”时,我的背景是C和C#,但对C++的了解并不多。这种“分配”有什么特别的原因吗? 最佳答案 当值类型更有趣时,例如std::vector,例如,std