为什么关于Qt库的官方示例和教程从来没有使用智能指针? 我只看到new和delete创build和销毁小部件。 我search了基本原理,但是找不到它,除了出于历史原因或向后兼容性之外,我没有看到它自己。不是每个人都希望程序在widget构造函数失败时终止,并通过try / catch块是丑陋的(即使在less数地方使用)。 家长小部件可能拥有孩子的所有权也只是部分地解释了我的事情,因为您仍然必须在某个级别上使用delete父母。
在boost库中有一些C ++ 1x的std :: unique_ptr的等价类吗? 我正在寻找的行为是能够有一个exception安全的工厂function,像这样… std::unique_ptr<Base> create_base() { return std::unique_ptr<Base>(new Derived); } void some_other_function() { std::unique_ptr<Base> b = create_base(); // Do some stuff with b that may or may not throw an exception… // Now b is destructed automagically. } 编辑:现在,我正在使用这个黑客,这似乎是最好的,我可以在这一点上… Base* create_base() { return new Derived; } void some_other_function() { boost::scoped_ptr<Base> b = […]
嗨,我有文件称为MyCode.h和MyCode.cpp 在MyCode.h中我已经声明 enum MyEnum {Something = 0, SomethingElse = 1}; class MyClass { MyEnum enumInstance; void Foo(); }; 然后在MyCode.cpp中: #include "MyCode.h" void MyClass::Foo() { enumInstance = MyEnum::SomethingElse; } 但使用g ++编译时出现错误“MyEnum”不是类或名称空间… (在MS VS2010中工作正常,但不是Linux的G + +) 有任何想法吗? 谢谢Thomas
我一直在阅读Unicode的主题 – 特别是在C ++ 11中的UTF-8(非)支持,我希望Stack Overflow的专家能够向我保证我的理解是正确的,或者指出我误解的地方或错过的地方。 一个简短的总结 首先,你可以在源代码中定义UTF-8,UTF-16和UCS-4文字。 此外, <locale>头文件包含了几个可以在UTF-8,UTF-16,UCS-4和平台多字节编码之间进行转换的std::codecvt实现(尽pipeAPI看起来很温和,但小于直截了当)。 这些codecvt实现可以imbue()在stream上,以便在读取或写入文件(或其他stream)时进行转换。 [ 编辑: Cubbi指出,我忽略了提及<codecvt>标题,它提供了不依赖于语言环境的std::codecvt实现。 此外, std::wstring_convert和wbuffer_convert函数可以使用这些codecvt来直接转换string和缓冲区,而不依赖于stream。] C ++ 11还包括C99 / C11 <uchar.h>头文件,其中包含将平台多字节编码(可能是也可能不是UTF-8)的单个字符转换成UCS-2和UCS-4的函数。 但是,这是关于它的程度。 虽然你当然可以将UTF-8文本存储在std::string ,但是我没有办法看到对它做任何有用的事情。 例如,除了在你的代码中定义一个文字,你不能validation一个字节数组是否包含有效的UTF-8,你不能找出长度(即Unicode字符的数量,对于“字符” )包含一个UTF-8的std::string ,并且不能以字节为单位以任何方式迭代std::string 。 同样,即使C ++ 11增加了std::u16string也不是真的支持UTF-16,而只是老的UCS-2 – 它不支持代理对,只留下了BMP。 意见 鉴于UTF-8是几乎所有Unix派生系统(包括Mac OS X和 * Linux)上处理Unicode的标准方法,并且已经基本成为网上事实上的标准,所以在现代C ++中缺乏支持像一个非常严重的遗漏。 即使在Windows上,新的std::u16string并不真正支持UTF-16的事实似乎有些遗憾。 *正如在评论中指出的,在这里明确指出,Mac OS的BSD派生部分使用UTF-8,而Cocoa使用UTF-16。 问题 如果您设法阅读所有这些,谢谢! 只是几个简单的问题,因为这是堆栈溢出毕竟… 上面的分析是否正确,或者是否有其他Unicode支持设施? 在过去几年中,标准委员会在推动C ++向前发展方面做了出色的工作。 他们都是聪明的人,我认为他们很清楚上述缺点。 是否有一个众所周知的原因,Unicode支持在C ++中仍然很差? outlook未来,有没有人知道有什么scheme可以纠正? 快速searchisocpp.org似乎没有透露任何东西。 […]
在Bjarne Stroustrup的主页( C ++ 11 FAQ )中: struct X { int foo(int); }; std::function<int(X*, int)> f; f = &X::foo; //pointer to member X x; int v = f(&x, 5); //call X::foo() for x with 5 它是如何工作的? std :: function如何调用foo成员函数 ? 模板参数是int(X*, int) ,是从成员函数指针转换成非成员函数指针的 &X::foo ? (int(*)(X*, int))&X::foo //casting (int(X::*)(int) to (int(*)(X*, int)) 澄清:我知道我们不需要使用任何指针来使用std :: function […]
给定所有这三个函数,这个调用是不明确的。 int f( int ); int f( int && ); int f( int const & ); int q = f( 3 ); 除去f( int )会导致Clang和GCC优先于左值引用的右值引用。 但相反,删除任何引用重载都会导致f( int )模糊。 重载parsing通常是用严格的偏序来完成的,但是int似乎相当于两个不相等的东西。 这里的规则是什么? 我似乎记得有关这方面的缺陷报告。 在未来的标准中, int &&可能比int更int吗? 引用必须绑定到初始化程序,而对象types不是那么受限制。 因此, T与T &&之间的重载可能有效地意味着“如果给予所有权,则使用现有对象,否则复制”。 (这与纯传值类似,但是节省了移动的开销)。由于这些编译器当前正在工作,所以这必须通过重载T const &和T && ,并明确复制来完成。 但我甚至不确定这是否是严格的标准。
我一直在阅读有关新的C ++ 11内存模型,我已经遇到了std::kill_dependency函数(§29.3/ 14-15)。 我正在努力理解为什么我会想要使用它。 我在N2664提案中find了一个例子,但没有多大帮助。 它首先显示没有std::kill_dependency代码。 这里,第一行在第二行中携带一个依赖项,它依赖于索引操作,然后将依赖项携带到do_something_with函数中。 r1 = x.load(memory_order_consume); r2 = r1->index; do_something_with(a[r2]); 还有一个例子使用std::kill_dependency来打破第二行和索引之间的依赖关系。 r1 = x.load(memory_order_consume); r2 = r1->index; do_something_with(a[std::kill_dependency(r2)]); 据我所知,这意味着索引和对do_something_with的调用在第二行之前是不依赖的。 根据N2664: 这允许编译器将调用重新sorting为do_something_with ,例如,通过执行预测优化来预测a[r2]的值。 为了调用do_something_with的值a[r2]是需要的。 如果假设编译器“知道”数组填充了零,则可以优化对do_something_with(0);调用do_something_with(0); 并根据其他两个指令重新sorting此通话。 它可以产生以下任何一种: // 1 r1 = x.load(memory_order_consume); r2 = r1->index; do_something_with(0); // 2 r1 = x.load(memory_order_consume); do_something_with(0); r2 = r1->index; // 3 do_something_with(0); r1 = x.load(memory_order_consume); […]
鉴于这个C + + 11程序,我应该期望看到一个数字或字母? 还是不做预期? #include <cstdint> #include <iostream> int main() { int8_t i = 65; std::cout << i; } 标准是否指定此types是否可以是字符types?
这个问题是由Herb Sutter的一篇post引起的 ,他解释了MS决定不支持/编译C99编译器,而只是使用C ++(11)标准中的C(99)特性。 一位评论者回答说 : (…)C是重要的,值得至less一点关注。 有很多现有的代码是有效的C但不是有效的C ++。 该代码不可能被重写(…) 因为我只用MS C ++编程,所以我真的不知道“纯”的C语言,也就是说,我没有准备好我所使用的C ++语言细节不在C(99)中,一些C99代码在C ++编译器中不起作用的线索。 请注意,我知道关于C99只restrict关键字,这对我来说似乎有非常狭窄的应用程序和有关变长数组(我不知道他们是多么广泛或重要)。 另外,我非常感兴趣的是,是否有任何重要的语义差异或陷阱,即C(99)代码将在C ++(11)下编译 ,但是与C编译器做了不同的事情。 快速链接:答案的外部资源: 维基百科页面 David R. Tribble的比较 (从2001年) C ++ 11标准: http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf (C.1节)
这里是我尝试使用unique_ptr for pimpl时看到的简化。 我select了unique_ptr,因为我真的希望类拥有指针 – 我希望pimpl指针和类的生命期是相同的。 无论如何,这是标题: #ifndef HELP #define HELP 1 #include <memory> class Help { public: Help(int ii); ~Help() = default; private: class Impl; std::unique_ptr<Impl> _M_impl; }; #endif // HELP 这里是来源: #include "Help.h" class Help::Impl { public: Impl(int ii) : _M_i{ii} { } private: int _M_i; }; Help::Help(int ii) : _M_impl{new Help::Impl{ii}} { […]