Tag: c ++ 11

移动语义和function顺序评估

假设我有以下几点: #include <memory> struct A { int x; }; class B { B(int x, std::unique_ptr<A> a); }; class C : public B { C(std::unique_ptr<A> a) : B(a->x, std::move(a)) {} }; 如果我正确理解有关“函数参数的未指定顺序”的C ++规则,则此代码是不安全的。 如果B的构造函数的第二个参数是使用移动构造函数首先构造的,那么现在包含一个nullptr ,expression式a->x将触发未定义的行为(可能是段错误)。 如果第一个参数是先构造的,那么一切都将按预期工作。 如果这是一个正常的函数调用,我们可以创build一个临时的: auto x = a->x B b{x, std::move(a)}; 但在类初始化列表中,我们没有创build临时variables的自由。 假设我不能改变B ,是否有任何可能的方法来完成上述? 即解除引用和移动一个unique_ptr在同一个函数调用expression式而不创build临时? 如果你可以改变B的构造函数,但不添加新的方法,如setX(int) ? 会有帮助吗? 谢谢

如何在Windows上更新MinGW中的GCC?

我习惯在Ubuntu上手动安装GCC,这是一个痛苦的过程。 所以我真的不想重复这个过程。 目前,我的机器上安装了MinGW和GCC(4.6.2)。 那么有没有一个简单的方法来更新GCC,而不是完全从源代码构build? 有没有人做过之前可以分享我的一些技巧?

std :: tuple get()成员函数

boost::tuple有一个get()成员函数,像这样使用: tuple<int, string, string> t(5, "foo", "bar"); cout << t.get<1>(); // outputs "foo" 看来C ++ 0x std::tuple没有这个成员函数,你必须使用非成员函数的forms: std::get<1>(t); 这对我来说看起来很丑。 为什么std::tuple没有成员函数有什么特别的理由? 还是只是我的实现(GCC 4.4)?

如何以编程方式确定在C ++中expression式是右值还是左值?

在C ++中确定expression式是右值还是左值的最好方法是什么? 也许,这在实践中是没有用的,但是因为我正在学习右值和左值,所以我认为有一个函数is_lvalue将返回true,如果在input中传递的expression式是左值,否则返回false。 例: std::string a("Hello"); is_lvalue(std::string()); // false is_lvalue(a); // true

为什么不编译器合并多余的std :: atomic写道?

我想知道为什么没有编译器准备将相同的值连续写入一个单一的primefacesvariables,例如: #include <atomic> std::atomic<int> y(0); void f() { auto order = std::memory_order_relaxed; y.store(1, order); y.store(1, order); y.store(1, order); } 我试过的每一个编译器都会发出上面的三次。 什么合法的,无竞争的观察者可以看到上面的代码和单个写入的优化版本(即不适用“as-if”规则)之间的区别? 如果variables是易变的,那么显然没有优化是适用的。 什么阻止了我的情况? 这是编译器资源pipe理器中的代码。

垃圾收集在C + + – 为什么?

我不断听到有人抱怨C ++没有垃圾收集。 我还听说C ++标准委员会正在考虑将其添加到语言中。 我害怕我只是没有看到它的意义…使用RAII智能指针消除了它的需要,对不对? 我唯一的垃圾收集经验是在几台便宜的八十年代的家用电脑上,这意味着系统每隔几秒就会冻结几秒钟。 我相信自那时以来已经有所改善,但正如你所猜测的那样,并没有给我一个很高的评价。 垃圾收集为经验丰富的C ++开发人员提供了什么好处?

std :: fstream缓冲vs手动缓冲(为什么手动缓冲10倍增益)?

我testing了两种书写configuration: 1)Fstream缓冲: // Initialization const unsigned int length = 8192; char buffer[length]; std::ofstream stream; stream.rdbuf()->pubsetbuf(buffer, length); stream.open("test.dat", std::ios::binary | std::ios::trunc) // To write I use : stream.write(reinterpret_cast<char*>(&x), sizeof(x)); 2)手动缓冲: // Initialization const unsigned int length = 8192; char buffer[length]; std::ofstream stream("test.dat", std::ios::binary | std::ios::trunc); // Then I put manually the data in the buffer // […]

基于其他元素大小的C ++联合元素大小

考虑下面的一段代码: struct S { union { int arr1[10]; char arr2[sizeof(arr1)]; }; }; 它在c ++ 03和c ++ 11模式下用gcc 4.9.2编译成功。 但是,当我改变S是一个模板,如下所示: template <size_t N> struct S { union { int arr1[N]; char arr2[sizeof(arr1)]; }; }; 我得到以下错误输出: error: int S<10ul>::<anonymous union>::arr1 [10]' is inaccessible int arr1[N]; error: within this context char arr2[sizeof(arr1)]; Clang仅在c ++ 11模式下编译这两个版本。 我很好奇这里的正确行为是什么。 也许我应该明确指出, arr2大小是sizeof(int) […]

为什么`std :: initializer_list`经常按值传递?

在我看到的几乎每个post中,涉及std::initializer_list人都倾向于通过值来传递std::initializer_list 。 根据这篇文章: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ 如果要制作传递对象的副本,应该通过价值传递。 但复制一个std::initializer_list不是一个好主意,因为 复制std::initializer_list不会复制底层对象。 原始初始化程序列表对象的生命周期结束后,基础数组不能保证存在。 那么为什么它的一个实例经常被有价值的传递,而不是被const&所保证,而不是一个不必要的副本呢?

C ++ 11&C ++ 14中“bsearch”的规范是否有缺陷?

从我对这个问题的回答开始,在C ++ 11和C ++ 14中: [C++11, C++14: 25.5/2]:内容与标准C库头<stdlib.h> ,但有以下几点例外: [C++11, C++14: 25.5/3]:函数签名: bsearch(const void *, const void *, size_t, size_t, int (*)(const void *, const void *)); 被两个声明所取代: extern "C" void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); extern "C++" void *bsearch(const void *key, const […]