草庐IT

c++ - 使用无符号数据类型来强制执行非负值和/或有效值是最佳做法吗?

最近,在重构session期间,我正在查看我编写的一些代码并注意到几件事:我的函数使用unsignedchar强制值在[0-255]区间内。其他函数使用int或long数据类型以及函数内部的if语句来静默限制值到有效范围。类中包含的值和/或声明为具有未知上限但已知且确定的非负下限的函数的参数被声明为unsigned数据类型(int或long取决于upperbound的可能性超过4,000,000,000)。这种不一致令人不安。这是我应该继续的好做法吗?我是否应该重新考虑逻辑并坚持使用int或long以及适当的非通知钳位?关于使用“适当”的注意事项:在某些情况下,我使用signed数据类

c++ - 按值返回时强制 RVO/移动构造

假设我有一个带有复制构造函数和移动构造函数的对象“foo”,以及一个函数foof(){foobar;/*dosomework*/returnbar;}该标准似乎声明编译器将尝试执行以下操作:NRVO,按右值引用返回,按值返回,失败;按照这个顺序。有什么方法可以强制编译器永远不按值返回,因为我的复制构造函数非常昂贵吗? 最佳答案 thecompilerwilltrytodo:NRVO,returnbyr-valueref,returnbyvalue,fail;inthatorder.上面的措辞不准确,可能表明您有误解。编译器可以使用N

c++ - C++11 是否强制要求 vector<int> 将 resize() 中的元素归零?

这个问题在这里已经有了答案:std::vector,defaultconstruction,C++11andbreakingchanges(2个答案)关闭9年前。这个问题是关于new[]int和new[]int()在语义和性能上的差异,以及在向allocator_traits::construct添加ctor参数的完美转发时可能无意中创建的从第一个到第二个措辞的变化().这个问题不涉及一个非常明显的问题,即默认ctor运行在由vector的resize()构造的所有新元素上。对我来说,在调整大小时清除内置类型vector的元素似乎是一种浪费。但是VS2012的实现使得resize(n)

c++ - 强制偏好 const 版本?

假设我有classA{doublea;doubleValue()const{returna;}double&Value(){returna;}}//later:Afoo;doubleb=foo.Value();现在,将调用非常量版本。有没有一种强制使用const版本的好方法?我认为使用类型转换是可能的,但我认为这不是很优雅。 最佳答案 您可以将其转换为const。doubleb=static_cast(foo).Value();(我不认为我曾经显式地将const添加到变量中。我不确定static_cast是否比const_cast.

c++ - 为什么 const char* 强制转换为 std::string 有效?

这个Actor令我困惑:#include#include#includeusingnamespacestd;intmain(){stringstr1=(string)"Icastthisthing"+"--thenaddthis";cout有人可以解释为什么这种c风格的字符串转换有效(或被允许)吗?我将生成的优化程序集与来自:stringstr1=string("Iconstructthisthing")+"--thenaddthis";而且它们看起来是相同的,所以我觉得我忘记了一些实际上允许互换这种转换/构造的C++语义。std::stringstr2=std::string("Ic

c++ - 在模板中使用 -> 以强制以下符号依赖

来自问题:Properuseofthis->答案是->可以用...inatemplate,inordertoforcethefollowingsymboltobedependent—inthislatteruse,itisoftenunavoidable.这是什么意思?这种用法的一个很好的例子是什么?我不太明白“依赖”在这种情况下是什么意思,但这听起来像是一个有用的技巧。 最佳答案 发表于其他问题:templatestructfoo:T{voidbar(){x=5;//doesn'tworkthis->x=5;//works-Tha

c++ - 我如何强制使用的模板参数实现 C++ 中的某些接口(interface)?

我认为这在C++中是不可能的,我有什么选项可以模拟这种行为? 最佳答案 将std::is_base_of用作:templateclassA{static_assert(std::is_base_of::value,"TmustderivefromIMyInterface");};您也可以在功能模板中进行相同操作。 关于c++-我如何强制使用的模板参数实现C++中的某些接口(interface)?,我们在StackOverflow上找到一个类似的问题: http

c++ - 当协程切换线程时,如何强制 Linux 上的 g++ 更新线程指针(用于 TLS)?

我在C++(编译器g++,在ARM上)中使用协程的自定义实现。协程可能会通过调用move_to_thread函数(或其他方式,但这将让我说明我的观点)从一个线程迁移到另一个线程。我过于简单化了,但它有点像这样:__threadintx=0;voidf(){x=5;//dosomemoreworkoncurrentthread(thread1,say)move_to_thread(2);//domorework,nowonthread2inty=x;//withoptimization,I'mgettingthewrongx}我遇到的问题是调用move_to_thread之前和之后完成的

c++ - 强制执行显式默认的特殊成员函数生成

在C++11中,可以显式默认一个特殊成员函数,如果它的隐式生成被自动阻止。但是,显式默认一个特殊成员函数只是撤销手动声明一些其他特殊成员函数(复制操作、析构函数等)导致的隐式删除,它不会强制编译器生成函数和代码即使函数实际上无法生成,也被认为是良构的。考虑以下场景:structA{A()=default;A(constA&)=default;A(A&&)=delete;//Moveconstructorisdeletedhere};structB{B()=default;B(constB&)=default;B(B&&)=default;//Moveconstructorisdefau

c++ - 通过提高新 C++ 代码的警告级别来强制构建的好方法

我继承了多个Windows应用程序的大型C++代码库,这些应用程序已被许多客户成功使用。代码库很大,>1millLOC。代码库已有15年以上的历史。代码库在某些领域以C编程风格和/或不是很现代的C++风格为主,例如不使用标准C++集合和算法。不幸的是,代码库仅以警告级别2(VisualC++中的/W2)编译。我想提高到3级(/W3)以提高安全性并为64位做好准备。将警告级别提高到3的最大问题是收到的许多警告涉及有符号/无符号不匹配,我认识到解决现有代码库的所有这些问题将是一项非常艰巨的任务。什么是确保和强制执行提交到代码库的新代码在编译时增加警告级别的好方法?用更一般的术语来说,这个问