考虑一个支持默认移动语义的typesT. 还要考虑下面的function: T f() { T t; return t; } T o = f(); 在旧的C ++ 03中,一些非最优编译器可能会调用复制构造函数两次,一次是“返回对象”,一次是o 。 在c ++ 11中,由于f()中的t是一个左值,所以这些编译器可能会像以前一样调用复制构造函数,然后调用o的移动构造函数。 指出避免第一个“额外复制”的唯一方法是在返回时移动t是否正确? T f() { T t; return std::move(t); }
考虑下面的程序: #include <array> int main() { std::array<int, 1> x = { 0 }; // warning! x = { { 0 } }; // no warning return 0; } 第一次初始化导致gcc 4.7.2上的警告… main.cpp:5:22: warning: unused variable 'x' [-Wunused-variable] …和铿锵3.1 main.cpp:5:28: warning: suggest braces around initialization of subobject [-Wmissing-braces] std::array<int, 1> x = { 0 }; 就标准而言,至less在这个例子中,双花括号或单花括号应该没有区别。 有两种方法来处理警告: […]
虚拟析构函数声明之后的覆盖标识符是否有特殊含义? class Base { public: virtual ~Base() {} virtual int Method() const {} }; class Derived : public Base { public: virtual ~Derived() override {} virtual int Method() override // error: marked override, but does not override – missing const {} }; 在虚拟方法上使用覆盖标识符是有用的,因为检查:当基本虚拟方法实际上没有被覆盖时,编译器将报告错误。 在虚拟析构函数上的重写是否也有任何意义/function?
C ++ FAQ lite “[29.17]为什么我的浮点比较不起作用? build议这个平等testing: #include <cmath> /* for std::abs(double) */ inline bool isEqual(double x, double y) { const double epsilon = /* some small number such as 1e-5 */; return std::abs(x – y) <= epsilon * std::abs(x); // see Knuth section 4.2.2 pages 217-218 } 这是否正确,这意味着等于零的唯一数字是+0和-0 ? 是否应该在testing零时使用这个函数,或者像是|x| < epsilon这样的testing |x| < epsilon […]
C ++ 17引入了一个名为std::scoped_lock的新的锁类。 从文档看,它看起来类似于已经存在的std::lock_guard类。 有什么区别,我应该什么时候使用它?
我正在研究用于video回放和录制的类的集合。 我有一个像公共接口一样的主类,有play() , stop() , pause() , record()等方法。然后我有一些主要的类来完成video解码和video编码。 我刚刚学习了C ++中嵌套类的存在,我很想知道程序员是怎么想的。 我有点小心翼翼,不确定它的好处/缺点,但是根据我正在阅读的书,它们似乎被用在我的例子中。 本书提出,在像我这样的场景中,一个好的解决scheme是将嵌套在接口类中的主力类,所以没有单独的客户端不想使用的类的文件,并避免任何可能的命名冲突? 我不知道这些理由。 嵌套类对我来说是一个新概念。 只是想看看程序员怎么看待这个问题。
我知道已经有一个post ,描述几乎相同,但我认为我有点不同。 我想知道的是如何组织你的扩展方法分配命名空间。 目前 – 对于我们框架中的扩展方法 – 我使用下面的命名空间模式 MyCompany.Web.Utils 里面我有扩展方法类。 这对我来说很好,因为我们的软件开发人员不能立即看到扩展程序。 考虑一下我有一个StringExtender类,它提供了一个扩展 String对象的非常方便的扩展方法“In” 。 有了上面提到的命名空间的扩展方法,我们的程序员将不会看到扩展方法,除非它们明确包含它的命名空间。 相反,如果我将扩展方法放在System命名空间中,所有人都会马上看到它,但是我已经读过这是不好的做法 。 所以我的问题是如何促进你的开发人员使用它们的扩展方法。
我怎样才能将List<object>为List<SomethingElse> ? ( SomethingElse已知从object下降 ) 奖金喋喋不休 投射清单: List<Object> first = …; List<SomethingElse> second = (List<SomethingElse>)first; 不起作用: 无法将types“System.Collections.Generic.List”转换为“System.Collections.Generic.List” 投射清单: List<SomethingElse> second = first.Cast<SomethingElse>(); 不起作用: 不能隐式地将types“System.Collections.Generic.List”转换为“System.Collections.Generic.List” 我实际上并不需要完整的List<T>对象,只是一个ICollection<T>会做: ICollection<SomethingElse> second = first; ICollection<SomethingElse> second = (ICollection<SomethingElse>)first; ICollection<SomethingElse> second = first.Cast<SomethingElse>(); 不工作。
以下在使用Linux的x86机器上使用gcc 4.5.2进行编译时不会给出任何警告: char foo = 255; 但是当我用-pedantic ,gcc说: 警告:在隐式常量转换中溢出 海湾合作委员会的行为方式是有点奇怪,这让我怀疑,如果我真的明白这个任务是怎么回事。 我认为,如果char在POSIX上是8位长,并且是默认签名的,那么它不能保持255 。 在C标准中,它表示无符号整数溢出导致溢出,但是有符号整数溢出未定义。 那么这个任务是不确定的行为呢? 为什么海湾合作委员会这样做?
我正在用java做一些小程序。 我知道,如果我写的是while(true); 该程序将在此循环中冻结 。 如果代码是这样的: testing1: public class While { public static void main(String[] args) { System.out.println("start"); while (true); System.out.println("end"); } } 编译器抛出错误: Exception in thread "main" java.lang.Error: Unresolved compilation problem: Unreachable code at While.main(While.java:6) 我不知道这个错误存在。 但我知道为什么它被抛出。 当然, 第6行是无法访问的 ,导致编译问题。 然后我testing了这个: testing2: public class While { public static void main(String[] args) { System.out.println("start"); a(); b(); […]