为什么不是std::initializer_list是内置的核心语言? 在我看来,这是C ++ 11的一个非常重要的特性,但它没有自己的保留关键字(或类似的东西)。 相反, initializer_list 只是标准库中的一个模板类,它具有来自编译器处理的新的braced-init-list {…}语法的特殊隐式映射 。 起初以为,这个解决scheme是相当黑客 。 这就是现在实现C ++语言的新增function:通过某些模板类的隐式angular色而不是核心语言? 请考虑这些例子: widget<int> w = {1,2,3}; //this is how we want to use a class 为什么select了一个新class级: widget( std::initializer_list<T> init ) 而不是使用类似于任何这些想法的东西: widget( T[] init, int length ) // (1) widget( T… init ) // (2) widget( std::vector<T> init ) // (3) 一个经典的数组,你可以在这里和那里添加const 语言中已经存在三个点(var-args,现在是可变参数模板),为什么不重用语法(并使之感觉内置 […]
我目前正在为UnconstrainedMelody编写一些代码,它具有通用方法来处理枚举。 现在,我有一个静态类与一堆方法, 只是用于“旗”枚举。 我不能添加这个作为约束…所以有可能他们也会被其他枚举types调用。 在这种情况下,我想抛出一个exception,但我不确定哪一个抛出。 只是为了使这个具体,如果我有这样的东西: // Returns a value with all bits set by any values public static T GetBitMask<T>() where T : struct, IEnumConstraint { if (!IsFlags<T>()) // This method doesn't throw { throw new ??? } // Normal work here } 什么是最好的例外扔? ArgumentException听起来合乎逻辑,但它是一个types参数而不是一个正常的参数,这很容易混淆。 我应该引入我自己的TypeArgumentException类吗? 使用InvalidOperationException ? NotSupportedException ? 还要别的吗? 我宁愿不为此创造我自己的例外,除非这显然是正确的事情。
我有一个应用程序与4个线程工作相同的代码。 但是,当我步它跳跃在不同的线程之间。 如何将其locking到一个线程,以便其他线程在debugging时被忽略?
考虑以下程序: #include <iostream> int main = ( std::cout << "C++ is excellent!\n", 195 ); 在Windows 7操作系统上使用g ++ 4.8.1(mingw64),程序编译并运行正常,打印: C ++非常好! 到控制台。 main似乎是一个全局variables而不是一个函数; 这个程序如何在没有函数main()情况下执行? 这个代码是否符合C ++标准? 该scheme的行为是否明确? 我也使用了-pedantic-errors选项,但程序仍然编译和运行。
考虑下面的C ++代码: void* a = &a; 为什么编译器不抱怨使用未声明的标识符? 另外,编译器认为variablesa是什么? 它是一个指向无效对象的指针,还是指向void*指针的指针?
在C ++ 11中有像这样的可变参数模板: template< class T, class… Args > unique_ptr<T> make_unique( Args&&… args ) { return unique_ptr<T>(new T(std::forward<Args>(args)…)); } 这里有一些好奇心:expression式std::forward<Args>(args)…使用Args和args但只有一个…标记。 此外, std::forward是一个非variables模板函数,只需要一个模板参数和一个参数。 这个(粗略的)是什么语法规则? 怎么可以推广? 另外:在函数实现中,省略号( … )在感兴趣的expression式的末尾。 是否有一个原因,在模板参数列表和参数列表省略号在中间?
我有一个虚拟函数的基类,我想在派生类中重写该函数。 有没有办法让编译器检查,如果我在派生类中声明的函数实际上覆盖了基类中的函数? 我想添加一些macros或确保我没有意外地声明一个新的函数,而不是重写旧的。 以这个例子: class parent { public: virtual void handle_event(int something) const { // boring default code } }; class child : public parent { public: virtual void handle_event(int something) { // new exciting code } }; int main() { parent *p = new child(); p->handle_event(1); } 这里调用parent::handle_event()而不是child::handle_event() ,因为孩子的方法没有使用const声明,因此声明了一个新的方法。 这也可能是函数名称中的拼写错误或参数types中的一些细微差别。 如果基类的接口发生变化,并且某些派生类没有更新以反映变化,也很容易发生。 有没有办法避免这个问题,我可以不知何故告诉编译器或其他工具来检查这个对我? 任何有用的编译器标志(最好用于g ++)? […]
我最近修改了一些代码,并在函数的一行中发现了一个预先存在的错误: std:;string x = y; 此代码仍在编译并按预期工作。 string定义工作,因为这个文件正在using namespace std; ,所以std::是不必要的。 问题是,为什么是std:; 编译和什么,如果有的话,它在做什么?
试图在这里运行一个项目的运行代码分析,并得到了一些这样的警告: CA1002:Microsoft.Design:更改“ SomeClass.SomeProtectedOrPublicProperty ”中的“List < SomeType >”以使用Collection,ReadOnlyCollection或KeyedCollection 为什么我应该使用Collection<T>而不是List<T> ? 当我看到msdn文档时,他们看起来几乎是平等的。 在阅读警告的错误帮助后,我发现 System.Collections.Generic.List(T)_是为性能而devise的通用集合,而不是inheritance,因此不包含任何虚拟成员。 但是这是什么意思呢? 我该怎么做呢? 我应该在内部继续使用List<T> ,然后在属性中返回一个new Collection<T>(someList)吗? 还是应该开始使用Collection<T>而不是List<T> ?
刚刚看到这个代码: artist = (char *) malloc(0); 我想知道为什么要这样做?