草庐IT

c++ - 传递初始化列表或容器,寻找移动语义?

编辑:在我们开始之前,这个问题不是关于std::initializer_list的正确使用;它是关于在需要方便的语法时应该传递什么。感谢您关注主题。C++11引入了std::initializer_list来定义接受花括号初始化列表参数的函数。structbar{bar(charconst*);bar(int);}dog(42);fnfoo(std::initializer_listargs);foo({"blah",3,dog});语法很好,但由于各种问题,它在底层令人反感:它们不能被有意义地移动。上面的函数必须从列表中复制dog;这不能转换为移动构造或省略。根本不能使用仅移动类型。

c++ - move 语义和虚拟方法

在C++11中,我们在某些情况下被引导通过值传递对象,在其他情况下通过常量引用。但是,该指南取决于实现的方法,而不仅仅是它的接口(interface)和它的客户的预期用途。当我写一个接口(interface)时,我不知道它将如何实现。编写方法签名有什么好的经验法则吗?例如-在下面的代码片段中,我应该使用Bar1或Bar2?classIFoo{public:virtualvoidBar1(std::strings)=0;virtualvoidBar2(conststd::string&s)=0;};如果您同意正确的签名取决于实现,则可以停止阅读此处。这是一个例子,说明了我为什么这么相信。

c++ - 接收参数并为可能失败的函数 move 语义(强大的异常安全性)

我有一个函数可以对作为接收器参数传入的大量数据进行操作。我的BigData类型已经支持C++11,并带有功能齐全的move构造函数和move赋值实现,因此我无需复制该死的东西就可以逃脱:ResultprocessBigData(BigData);[...]BigDatab=retrieveData();Resultr=processBigData(std::move(b));这一切都很好。但是,我的处理功能可能会在运行时偶尔失败,从而导致异常。这不是真正的问题,因为我可以修复问题并重试:BigDatab=retrieveData();Resultr;try{r=processBigDa

c++ - 复制或引用 boost::spirit's rule<> 的语义?

我正在尝试在Boost.Spirit中编写一个shell语言解析器。但是,我不清楚有关rules语义的一些基本问题。看文档,有rule的成员r.alias()和r.copy()。IIUC,这些成员应分别返回对规则的引用和规则内容的拷贝。但是,没有明确说明当我只是在另一个规则的定义中使用该规则时会发生什么。从我的实验中,我发现相互递归规则可以定义为:ruler1,r2;r1=...>>r2>>...;r2=...>>r1>>...;这表明规则是通过在解析器表达式中引用来获取的。问题是,当变量超出范围时它会做什么,例如:ruler1;{ruler2;r1=...>>r2>>...;r2=.

c++ - C++ 引用中 & 符号在语义上的准确位置是什么

众所周知,语义上准确的指针声明方式是int*x;代替int*x;这是因为C将*x视为int,而不是将x视为int指针。这很容易证明int*a,b;其中a是一个int指针,而b是一个int。StackOverflow上至少有5个重复的问题讨论了这个问题以供引用。但是引用文献呢? 最佳答案 BjarneStroustrup说:AtypicalCprogrammerwritesint*p;andexplainsit*piswhatistheintemphasizingsyntax,andmaypointtotheC(andC++)decl

c++ - 语义迭代器声明?

对不起,我的标题很模糊,我真的不知道如何给这个问题起标题。假设我有这个:std::listmsgs;for(std::list::iteratorit=msgs.begin();it对我来说,这很难读懂。std::list::iterator几乎看起来像一个神奇的数字,特别是如果msgs的声明很远,就像在头文件中一样。IMO如果它是这样的,它会更容易阅读并且更具语义:std::listmsgs;for(msgs.iteratorit=msgs.begin();it现在,这显然是非法的C++。但我的问题是,有没有一种方法可以实现支持像这样编写迭代器声明的方法?

c++ - 将 std::vector 传递给构造函数并移动语义

周末我试图更新我的c++技能并学习一些c++11,我偶然发现了以下问题:我无法强制我的容器类正确使用移动构造函数:我有一个生成器类,定义如下:classbuilder{...containerbuild()const{std::vectoritems;//...fillupthevectorreturncontainer(items);//shouldmovethevectorright?wrong!//returncontainer(std::move(items));alsodoesn'twork}}类item和container,定义如下:classcontainer{publi

c++ - move 语义和窗口句柄。 DeleteObject 安全句柄?

Windows中是否存在某种NULL句柄?如果我通过CreateCompatibleBitmap()创建一个bmp并通过DeleteObject()删除它并且想要使用move语义,我想确保位图没有被破坏。因此,我必须将HBITMAP设置为可以安全删除的值。比如deletenullptr。 最佳答案 首先是坏消息。由于历史原因,WindowsAPI中没有普遍有效的“无效句柄”值。Windows中的不同子系统将NULL或INVALID_HANDLE_VALUE视为无效句柄值(用于返回无效句柄值和获取无效句柄值)。Relatedartic

windows - 如何理解acquire和release语义?

我从MSDN中找到了三个函数,如下:1.InterlockedDecrement().2.InterlockedDecrementAcquire().3.InterlockedDecrementRelease().我知道那些函数用来递减一个值作为原子操作,但我不知道这三个函数之间的区别 最佳答案 (um...butdon'taskmewhatdoesitmeanexactly)我会尝试一下。需要记住的是,编译器或CPU本身可能会重新排序内存读写,如果它们似乎没有相互处理的话。这很有用,例如,如果您有一些代码可能正在更新结构:if(p

sql-server - 语义 Web - 将应用程序数据直接存储在 RDF 中或存储在 SQL 中并稍后导出/导入

我有一个标准的IISWeb应用程序,它将其数据存储在标准的SQLServer或Oracle数据库中。我现在有兴趣将数据存储在RDF中格式,以实现完整的语义网。是否推荐直接以RDF格式存储数据?CRUDQ操作将在数据上完成。就性能而言,这是一个好举措吗?如果不是(就像我假设的那样),我想我会维护标准的SQL数据库并将数据导出到RDF或从中导入数据?我怎样才能做到这一点?那里有好的转换器吗? 最佳答案 如果你真的想坚持使用关系数据库,我不推荐,你可以使用类似D2RQ的东西或者你可以寻找支持的东西,比如R2RML.或者你可以试试SDB.但