草庐IT

c++ - 关于左值到右值的转换,什么时候需要?

我在网上看了很多,好像很多人都提到了下面的规则(但我在标准中找不到),加法运算符+(以及所有其他二元运算符)要求两个操作数都是右值,结果也是右值。等等..我查看了C++标准,它明确指出(条款3.10/2),Wheneveraglvalueappearsinacontextwhereaprvalueisexpected,theglvalueisconvertedtoaprvalue(第5/9条),Wheneveraglvalueexpressionappearsasanoperandofanoperatorthatexpectsaprvalueforthatoperand,thelval

c++ - 大整数值的定义

我有一个项目,我处理不适合整数的大数字(ns-timestamps)。因此,我想使用例如int64_t,目前正在编写测试用例(是!)。为了检查大量的行为,我从类似的东西开始int64_tval=2*std::numeric_limits::max();qDebug()返回longval-2(就像我将val定义为int一样)。但是如果我写int64_tval=std::numeric_limits::max();val*=2;qDebug()我明白了longval4294967294这看起来是正确的。所以对我来说,似乎2*max()首先存储在一个整数中(在此步骤中被截断),然后复制到in

c++ - 为什么我可以将接受值的可调用对象传递给接受引用的 std::function?

当我声明一个变量时function,编译器仍然允许我分配一个接受值的lambda:functionhandler;handler=[](Foof){};(参见http://cpp.sh/5dsp)因此当处理程序被调用时,会生成一个拷贝。标准的哪一部分允许这样做?有没有一种方法可以标记客户端代码这将是一个问题(某种static_assert之类的?)? 最佳答案 根据[func.wrap.func.con]std::function有一个templatefunction&operator=(F&&f);附上以下备注:Thisassig

c++ - 控制枚举值的可见性

考虑一个导出枚举的C++类,在该枚举上维护一个内部数组,并希望导出一个从枚举中接受值的命令。classfoo{public:enumcolor{red,yellow,green,NUM_COLORS};private:somethingsomebody[NUM_COLORS];public:voidcommand(colorc);};是否有一种干净的方法可以仅导出实际颜色,而不导出NUM_COLORS种颜色?当编译器的类型系统真的应该能够为我做这件事时,我不想在每次调用时都检查边缘情况。明显的hack是:classfoo{public:enumcolor{red,yellow,gree

c++ - 更改任意数字类型值的范围刻度

我需要将一组数字从一个范围转换到另一个范围,同时保持值的相对分布。例如,可以缩放包含随机生成的float的vector以适应可能的无符号字符值(0..255)。忽略类型转换,这意味着无论提供什么输入(例如-1.0到1.0),所有数字都将缩放到0.0到255.0(或附近)。我已经创建了一个模板类来执行这个转换,它可以应用到一个使用std::transform的集合:templateclassscale_value{constTYPEfmin,tmin,ratio;public:TYPEoperator()(constTYPE&v){TYPEvv(v);vv+=(TYPE(0)-fmin)

c++ - 以引用为值的 unordered_map

具有值类型为引用C++11的unordered_map是否合法?例如std::unordered_map我已经设法让它与VS2013一起编译,但是我不确定它是否应该这样做,因为它会导致一些奇怪的运行时错误。例如vectorsubscriptoutofrange尝试erase时抛出一个元素。一些谷歌搜索结果发现你不能有一个引用vector,但我找不到任何关于unordered_map的信息。更新进一步的实验表明vectorsubscriptoutofrange与引用的unordered_map无关,因为它是我代码中的错误。 最佳答案

c++ - 包含未初始化值的对象 vector

此代码是否会导致未定义的行为:#includestructS{S(){}intx;};intmain(){std::vectorvec(5,S());}自S()默认初始化一个自动对象,它的内容不会先归零,所以x将是不确定的。然后将包含不确定值的对象复制到每个vector位置。动机:我们可能希望它的行为与std::vectorvec(5);相同这不是UB(C++11起),所以这是一个很容易不小心犯的错误。正如Praetorian在C++11之前的评论中提到的std::vectorvec(5);可以自由地进行5次默认初始化,或者对部分或全部项目使用复制构造函数。

c++ - 左值的 decltype 括号语法

我试图更好地理解decltype以确定编译时表达式的类型。比方说,我用一个双变量来做:#include#includeintmain(){doublea;typedefdecltype(a)a_type;typedefdecltype((a))ref_a_type;typedefdecltype(a)&o_ref_a_type;a_typeb;ref_a_typec=b;o_ref_a_typed=b;if(std::is_same::value)std::cout::value)std::cout::value)std::cout如果我没有理解错的话,这些观点应该是正确的:如果a是左

MyBatis获取参数值的两种方式

MyBatis获取参数值的两种方式:${}和#{}${}的本质就是字符串拼接,#{}的本质就是占位符赋值。${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号。JDBC原生的获取参数方式:字符串拼接的方式Stringname;select*fromwherename="'+name+'";占位符赋值的方式Stringsql="select*fromwherename=?";单个字面量类型的形参publicinterfaceUserMapper{/

c++ - move_iterator 对于返回纯右值的迭代器被破坏并返回悬空引用

我查看了std::move_iterator的STL源代码并发现它返回Iterator::value_type&&.当Iterator::reference时,这会导致不正确的行为是右值,与Iterator::value_type&不同.我有一个带有代理对象的类reference(如std::vector),它可以隐式转换为value_type.普通迭代器只是取消对这个代理的引用(输入迭代器要求允许这样做),但是std::move_iterator调用转换为value_type带有开销,然后返回对创建的临时对象的悬空引用。std::move_iterator仍然适用于std::vect