Tag: c ++ 11

为什么有些人使用交换分配移动?

例如,stdlibc ++具有以下内容: unique_lock& operator=(unique_lock&& __u) { if(_M_owns) unlock(); unique_lock(std::move(__u)).swap(*this); __u._M_device = 0; __u._M_owns = false; return *this; } 为什么不直接将这两个__u成员分配给* this? 不交换意味着__u被分配了*这个成员,只是以后再分配0和false …在这种情况下交换是做不必要的工作。 我错过了什么? (unique_lock :: swap只是在每个成员上执行std :: swap)

uint8_t,uint16_t,…的格式说明符?

如果我有一个整数variables,我可以使用sscanf ,如下所示使用格式说明符%d。 sscanf (line, "Value of integer: %d\n", &my_integer); 我在哪里可以finduint8_t , uint16_t , uint32_t和uint64_t格式说明符? uint64_t可能有%lu。

std :: reference_wrapper和简单指针之间的区别?

为什么需要有std::reference_wrapper ? 应该在哪里使用? 它与简单的指针有何不同? 它的性能如何比较简单的指针?

为什么在基于范围的初始值设定项中使用临时对象会导致崩溃?

为什么下面的代码在Visual Studio和GCC上都崩溃? 为了使它崩溃,它需要基于范围的for循环,std :: map,std :: string并引用string。 如果我删除其中的任何一个,它将工作。 #include <iostream> #include <string> #include <map> using namespace std; struct S { map<string, string> m; S() { m["key"] = "b"; } const string &func() const { return m.find("key")->second; } }; int main() { for (char c : S().func()) cout << c; return 0; } Ideone链接: http ://ideone.com/IBmhDH

如何声明一个接受lambda的函数?

我在网上阅读了许多教程,解释了如何使用lambdas与标准库(如std::find ),他们都非常有趣,但我找不到任何解释如何使用lambda为我自己的function。 例如: int main() { int test = 5; LambdaTest([&](int a) { test += a; }); return EXIT_SUCCESS; } 我应该如何申报LambdaTest ? 第一个参数的types是什么? 然后,我怎样才能调用传递给它的匿名函数 – 例如 – “10”作为它的参数?

C ++ 11:用std :: shared_ptr()replace所有非拥有的原始指针?

随着std::unique_ptr的出现,瑕疵的std::auto_ptr最终可以被搁置。 所以最近几天,我一直在改变我的代码使用智能指针,并消除从我的代码的所有delete 。 虽然valgrind说我的代码是内存清理的,但是智能指针的语义丰富性会使代码变得更清晰和更容易理解。 在大多数代码中,翻译很简单:使用std::unique_ptr代替拥有的对象持有的原始指针,抛出delete ,然后小心地get() , reset()和move()调用需要与其他代码进行良好的交互。 我现在正在将非拥有的原始指针翻译成智能指针。 由于我对我的对象的生命周期(我确保我的模块只依赖于一个方向)的生命周期小心,valgrind告诉我,我没有任何未初始化的读取,悬挂指针或泄漏。 所以,从技术上讲,我现在可以把那些非拥有的原始指针单独留下。 但是,一个select是将那些非拥有的原始指针改为std::shared_ptr因为我知道它们是非循环的。 或者,将它们作为原始指针会更好吗? 我需要智能指针的资深用户提供一些build议,关于用什么规则来决定是否保留非拥有的原始指针 ,或者将它们转换成std::shared_ptr ,请记住,testing和valgrind我的代码。 编辑:我可能会误解std::shared_ptr的使用 – 它们可以与std::unique_ptr一起使用,或者,如果我使用std::shared_ptr ,所有的句柄也应该是std::shared_ptr ?

初始化一个向量为零C ++ / C ++ 11

我知道在C ++ 11中,他们添加了将variables初始化为零的function double number = {}; // number = 0 int data{}; // data = 0 有没有类似的方法来初始化一个固定长度的std::vector到所有的零?

获取大小std ::数组没有实例

给定这个结构: struct Foo { std::array<int, 8> bar; }; 如果我没有Foo的实例,我怎样才能得到bar数组元素的数量?

Lambda的显式返回types

当我尝试编译这个代码(VS2010)时,我得到以下错误: error C3499: a lambda that has been specified to have a void return type cannot return a value void DataFile::removeComments() { string::const_iterator start, end; boost::regex expression("^\\s?#"); boost::match_results<std::string::const_iterator> what; boost::match_flag_type flags = boost::match_default; // Look for lines that either start with a hash (#) // or have nothing but white-space preceeding the hash symbol remove_if(rawLines.begin(), […]

重载参考,而不是唯一的传值+ std :: move?

看来有关C ++ 0x的右值的主要build议是添加移动构造函数并将运算符移到您的类中,直到编译器默认实现它们。 但是如果你使用VC10,等待是一个失败的策略,因为在VC10 SP1之前,自动生成可能不会在这里,或者在最坏的情况下VC11。 可能的话,这个等待会以年计算。 这是我的问题。 编写所有这些重复的代码并不好玩。 而且看起来不愉快。 但这是一个很受欢迎的负担,因为这些课程被认为是缓慢的。 数百乃至数千个较小的class级并非如此。 ::叹息:: C ++ 0x应该让我写更less的代码,而不是更多! 然后我有一个想法。 许多人分享,我猜想。 为什么不把价值通过一切? 不会std :: move + copy elision使这近乎最佳? 示例1 – 典型的Pre-0x构造函数 OurClass::OurClass(const SomeClass& obj) : obj(obj) {} SomeClass o; OurClass(o); // single copy OurClass(std::move(o)); // single copy OurClass(SomeClass()); // single copy 缺点: rvalues浪费的副本。 示例2 – 推荐的C ++ 0x? OurClass::OurClass(const […]