Questions tagged «c++11»

将此标记用于必须作为C ++ 11编译的代码(不使用C ++ 14或更高版本中引入的任何功能)。

5
shared_ptr和weak_ptr的区别
我正在阅读Scott Meyers的“ Effective C ++”书。有人提到,有tr1::shared_ptr并且tr1::weak_ptr像内置指​​针一样工作,但是它们会跟踪tr1::shared_ptrs指向一个对象的数量。 这称为参考计数。这样可以很好地防止非循环数据结构中的资源泄漏,但是,如果两个或多个对象包含tr1::shared_ptrs一个循环,则该循环可以使彼此的引用计数保持在零以上,即使指向该循环的所有外部指针都已被破坏。 那就是tr1::weak_ptrs进来的地方。 我的问题是循环数据结构如何使引用计数大于零。我请一个示例C ++程序。问题如何解决weak_ptrs?(再次,请举个例子)。

5
Lambda的返回类型可以通过返回值来推断,那么为什么函数不能呢?
#include <iostream> int main(){ auto lambda = [] { return 7; }; std::cout << lambda() << '\n'; } 该程序编译并打印7。lambda 的返回类型根据返回值7推导为整数类型。 为什么普通功能无法做到这一点? #include <iostream> auto function(){ return 42; } int main(){ std::cout << function() << '\n'; } 错误:“函数”函数使用“自动”类型说明符,而没有尾随返回类型
75 c++  function  c++11  lambda  auto 


6
C ++ 11 std :: set lambda比较函数
我想std::set用自定义比较功能创建一个。我可以使用来将其定义为类operator(),但是我想享受在其中使用lambda的能力,因此我决定在具有std::set作为成员的类的构造函数的初始化列表中定义lambda函数。但是我无法获得lambda的类型。在继续之前,这里有一个例子: class Foo { private: std::set<int, /*???*/> numbers; public: Foo () : numbers ([](int x, int y) { return x < y; }) { } }; 搜索后,我发现了两种解决方案:一种是使用std::function。只需将设置比较函数类型设置为be,std::function<bool (int, int)>然后像我一样完全传递lambda即可。第二种解决方案是编写一个make_set函数,例如std::make_pair。 解决方案1: class Foo { private: std::set<int, std::function<bool (int, int)> numbers; public: Foo () : numbers ([](int x, int y) { return …

2
C ++ 11的原始字符串文字R“(…)”中括号的基本原理是什么?
C ++ 11中引入了一个非常方便的功能,称为原始字符串文字,即没有转义字符的字符串。而不是这样写: regex mask("\\t[0-9]+\\.[0-9]+\\t\\\\SUB"); 您可以简单地这样写: regex mask(R"(\t[0-9]+\.[0-9]+\t\\SUB)"); 更具可读性。但是,请注意,必须在字符串周围附加括号以定义原始字符串文字。 我的问题是,为什么我们甚至需要这些?对我来说,这看起来很丑陋且不合逻辑。这是我所看到的缺点: 额外的冗长性,而整个功能则使文字更加紧凑 难以区分文字的正文和定义的符号 我的意思是硬区分: "good old usual string literal" ^- body inside quotes -^ R"(new strange raw string literal)" ^- body inside parenthesis -^ 这是专业人士: 更大的灵活性,原始字符串中提供了更多字符,尤其是与定界符一起使用时: "delim( can use "()" here )delim" 但是,如果您需要更大的灵活性,则可以使用旧的可转义字符串字面量。为什么标准委员会决定用这些绝对不必要的括号来污染每个原始字符串文字的内容?这背后的原因是什么?我没有提到哪些专业人士? UPD Kerrek的答案很好,但不幸的是,这不是答案。由于我已经描述过,所以我了解它的工作原理以及它带来的好处。自从我问了这个问题已经过去了五年,但仍然没有答案。我仍然对该决定感到沮丧。可以说这是一种品味问题,但我不同意。你用多少空间,你怎么命名的变量,这是SomeFunction()还是some_function()-这是品味的问题。而且我真的可以轻松地从一种样式切换到另一种样式。 但这吗?。这么多年后仍然感到笨拙和笨拙。不,这与味道无关。这是关于无论如何我们都希望涵盖所有可能的情况。每当我们需要编写Windows特定路径,正则表达式或多行字符串文字时,我们注定要编写这些丑陋的括号。那又是什么?..对于那些实际上需要放入"字符串的罕见情况?我希望我在那个委员会会议上决定以这种方式这样做。我会坚决反对这个错误的决定。我希望。现在我们注定了。 感谢您阅读本文。现在我感觉好多了。 UPD2这是我的替代建议,我认为这两个建议都将比现有建议更好。 提议1.受python启发。无法支持带三引号的字符串文字:R"""Here is a …

10
为什么对于不能TriviallyCopyable的对象,std :: memcpy的行为将无法定义?
来自http://en.cppreference.com/w/cpp/string/byte/memcpy: 如果对象不是TriviallyCopyable(例如标量,数组,C兼容结构),则该行为是不确定的。 在我的工作中,std::memcpy很长时间以来,我们一直使用以下方法按位交换不可TriviallyCopyable的对象: void swapMemory(Entity* ePtr1, Entity* ePtr2) { static const int size = sizeof(Entity); char swapBuffer[size]; memcpy(swapBuffer, ePtr1, size); memcpy(ePtr1, ePtr2, size); memcpy(ePtr2, swapBuffer, size); } 从来没有任何问题。 我了解滥用std::memcpy非TriviallyCopyable对象并导致下游未定义行为是微不足道的。但是,我的问题是: std::memcpy与非TriviallyCopyable对象一起使用时,为什么自身的行为不确定?为什么标准认为有必要指定该标准? 更新 针对此帖子和该帖子的答案已修改了http://en.cppreference.com/w/cpp/string/byte/memcpy的内容。当前的描述是: 如果对象不是TriviallyCopyable(例如标量,数组,与C兼容的结构),则除非程序不依赖于目标对象的析构函数的影响(不是由memcpy)运行,否则行为是不确定的。目标对象(以结束,但不是以开头memcpy)是通过其他一些方式(例如,新放置)来启动的。 聚苯乙烯 @Cubbi的评论: @RSahu如果可以保证UB下游,它将使整个程序未定义。但我同意,在这种情况下似乎有可能绕过UB,并相应地修改了cppreference。

6
如何确保类的每个方法都首先调用其他方法?
我有 : class Foo { public: void log() { } void a() { log(); } void b() { log(); } }; 有没有一种方法可以让我使用Foo调用的每个方法log(),而无需显式键入log()作为每个函数的第一行?我想这样做,这样我就可以向每个函数添加行为而不必遍历每个函数并确保进行了调用,并且还可以在添加新函数时自动添加代码... 这有可能吗?我无法想象如何使用宏执行此操作,因此不确定从哪里开始...到目前为止,我唯一想到的方法是添加“预构建步骤”,以便在编译之前扫描文件并编辑源代码,但这似乎并不明智。 编辑:只是为了澄清-我不希望log()明显地调用自己。它不需要成为课程的一部分。 编辑:我更喜欢使用跨平台工作的方法,并且仅使用stl。
74 c++  c++11 

3
在Qt,QtCreator和QMake中配置GCC编译器开关
我最近尝试在Windows 7(64位)上使用Qt Creator 1.3.2,Qt 4.6.2和GCC 4.4.0(32位版本)来使用一些实验性的C ++ 0x扩展和遇到以下(致命)错误: 该文件需要编译器和库支持即将推出的ISO C ++标准C ++ 0x。该支持目前处于试验阶段,必须使用-std = c ++ 0x或-std = gnu ++ 0x编译器选项启用。 在寻找解决方案时,我遇到了线程qmake和编译器标志?,并将以下内容添加到.pro文件中: CXXFLAGS += -std=c++0x 但这似乎没有什么不同。 因此,我希望有一些标签需要添加到.pro(项目)文件中,但是我以前从未对Qt,QMake和QtCreator中的GCC编译器开关感到困惑,并且我不确定正确的调用/咒语。因此,我的问题是在使用QtCreator,QMake和Qt时如何设置GCC编译器开关?
74 c++  qt  c++11  qt-creator 

2
C ++ 11:为什么std :: condition_variable使用std :: unique_lock?
std::unique_lock与一起工作时的角色使我有些困惑std::condition_variable。据我了解的文档,std::unique_lock它基本上是一个ated肿的锁卫士,可以在两个锁之间交换状态。 到目前为止,我已经pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)为此目的使用过(我猜这就是STL在posix上使用的功能)。它需要一个互斥锁,而不是锁。 这有什么区别?是std::condition_variable处理std::unique_lock优化的事实吗?如果是这样,它到底有多快?

11
使用“自动”类型推导-如何找出编译器推导的类型?
我如何找出使用auto关键字时编译器推断出的类型? 示例1:更简单 auto tickTime = 0.001; 是推导为afloat还是adouble? 示例2:更复杂(和我目前的头痛): typedef std::ratio<1, 1> sec; std::chrono::duration<double, sec > timePerTick2{0.001}; auto nextTickTime = std::chrono::high_resolution_clock::now() + timePerTick2; 什么类型的nextTickTime? 我遇到的问题是尝试发送nextTickTime给时std::cout。我收到以下错误: ./main.cpp: In function ‘int main(int, char**)’: ./main.cpp:143:16: error: cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’ std::cout << std::setprecision(12) << nextTickTime << std::endl; // time in seconds ^ …
74 c++  c++11  auto  chrono 

5
使用std :: chrono在C ++中输出日期和时间
我一直在升级一些旧代码,并在可能的情况下尝试更新到c ++ 11。以下代码是我过去在程序中显示时间和日期的方式 #include <iostream> #include <string> #include <stdio.h> #include <time.h> const std::string return_current_time_and_date() const { time_t now = time(0); struct tm tstruct; char buf[80]; tstruct = *localtime(&now); strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct); return buf; } 我想使用std :: chrono(或类似的格式)以类似的格式输出当前时间和日期,但是不确定如何去做。任何帮助将不胜感激。谢谢
74 c++  date  c++11  time  chrono 


6
创建持有已分配数组的unique_ptr的正确方法
创建一个unique_ptr来保存在免费存储中分配的数组的正确方法是什么?Visual Studio 2013默认情况下支持此功能,但是当我在Ubuntu上使用gcc版本4.8.1时,会出现内存泄漏和未定义的行为。 可以使用以下代码重现该问题: #include <memory> #include <string.h> using namespace std; int main() { unique_ptr<unsigned char> testData(new unsigned char[16000]()); memset(testData.get(),0x12,0); return 0; } Valgrind将给出以下输出: ==3894== 1 errors in context 1 of 1: ==3894== Mismatched free() / delete / delete [] ==3894== at 0x4C2BADC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==3894== by 0x400AEF: …
74 c++  linux  gcc  c++11  unique-ptr 

3
如何向下转换std :: shared_ptr?
考虑: struct SomethingThatsABase { virtual bool IsChildOne() const { return false; } virtual bool IsChildTwo() const { return false; } }; struct ChildOne : public SomethingThatsABase { virtual bool IsChildOne() const { return true; } }; struct ChildTwo : public SomethingThatsABase { virtual bool IsChildTwo() const { return true; } …

12
允许枚举类使用基于范围的For吗?
我有一个循环的代码块,在其中循环遍历的所有成员enum class。 for与新的相比,我目前使用的循环看起来非常笨拙range-based for。 有什么办法可以利用C ++ 11的新功能来减少当前for循环的冗长程度? 我想改进的当前代码: enum class COLOR { Blue, Red, Green, Purple, First=Blue, Last=Purple }; inline COLOR operator++( COLOR& x ) { return x = (COLOR)(((int)(x) + 1)); } int main(int argc, char** argv) { // any way to improve the next line with range-based for? …
73 c++  for-loop  c++11  enums 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.