标签: c++11

std :: unique_lock <std :: mutex>或std :: lock_guard <std :: mutex>?

我有两个用例.

答:我想将两个线程的访问同步到队列.

B.我想将两个线程的访问同步到队列并使用条件变量,因为其中一个线程将等待内容由另一个线程存储到队列中.

对于用例AI,请参阅代码示例std::lock_guard<>.对于用例BI,请参阅使用的代码示例std::unique_lock<>.

两者之间有什么区别,我应该在哪个用例中使用哪一个?

c++ multithreading mutual-exclusion c++11 stdmutex

318
推荐指数
5
解决办法
13万
查看次数

如何使用基于范围的for()循环与std :: map?

C++ 11基于范围的()循环的常见示例总是这样简单:

std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
     std::cout << xyz << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下xyz是一个int.但是,当我们有像地图这样的东西时会发生什么?此示例中变量的类型是什么:

std::map< foo, bar > testing = { /*...blah...*/ };
for ( auto abc : testing )
{
    std::cout << abc << std::endl;         // ? should this give a foo? a bar?
    std::cout << abc->first << std::endl;  // ? or is abc an iterator?
}
Run Code Online (Sandbox Code Playgroud)

当遍历的容器很简单时,看起来基于范围的()循环将给我们每个项目,而不是迭代器.哪个好...如果它是迭代器,我们总是要做的第一件事就是取消引用它.

但是,当涉及到地图和多重映射等内容时,我会感到困惑.

(我仍然使用g …

c++ dictionary for-loop c++11

316
推荐指数
4
解决办法
25万
查看次数

C++ 11基于反向范围的for-loop

是否有一个容器适配器可以反转迭代器的方向,所以我可以反向迭代一个容器,基于范围的for循环?

使用显式迭代器,我会将其转换为:

for (auto i = c.begin(); i != c.end(); ++i) { ...
Run Code Online (Sandbox Code Playgroud)

进入这个:

for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
Run Code Online (Sandbox Code Playgroud)

我想转换这个:

for (auto& i: c) { ...
Run Code Online (Sandbox Code Playgroud)

对此:

for (auto& i: std::magic_reverse_adapter(c)) { ...
Run Code Online (Sandbox Code Playgroud)

有这样的事情还是我必须自己写?

c++ c++11 ranged-loops

309
推荐指数
8
解决办法
10万
查看次数

C++代码可以在C++ 03和C++ 11中有效但是做不同的事情吗?

C++代码是否可以符合C++ 03标准和C++ 11标准,但根据编译的标准,可以做不同的事情吗?

c++ language-lawyer c++11 c++03

294
推荐指数
7
解决办法
2万
查看次数

const vs constexpr关于变量

以下定义之间有区别吗?

const     double PI = 3.141592653589793;
constexpr double PI = 3.141592653589793;
Run Code Online (Sandbox Code Playgroud)

如果没有,在C++ 11中首选哪种风格?

c++ variables const constexpr c++11

275
推荐指数
5
解决办法
9万
查看次数

使用成员函数启动线程

我试图std::thread用一个不带参数和返回的成员函数构造一个void.我无法弄清楚任何有效的语法 - 编译器无论如何都会抱怨.实现的正确方法是什么,spawn()以便返回std::thread执行的test()

#include <thread>
class blub {
  void test() {
  }
public:
  std::thread spawn() {
    return { test };
  }
};
Run Code Online (Sandbox Code Playgroud)

c++ multithreading c++11

269
推荐指数
4
解决办法
30万
查看次数

"int main(){(([[(){})());}"有效的C++是怎样的?

我最近遇到了以下深奥的代码.

int main(){(([](){})());}
Run Code Online (Sandbox Code Playgroud)

按如下方式重新格式化以使其更具可读性:

int main(){
    (([](){})());   //  Um... what?!?!
}
Run Code Online (Sandbox Code Playgroud)

但我无法理解如何(([](){})())有效的代码.

  • 它看起来不像函数指针语法.
  • 它不能是一些运算符重载技巧.代码按原样编译.

谷歌对这种全符号搜索没有多大帮助.但它在Visual Studio 2010中编译并且不输出任何内容.没有错误,也没有警告.所以它看起来像有效的代码.

我从未见过任何在JavascriptC函数指针之外如此奇怪的有效代码.

有人可以解释这是如何有效的C++?

c++ syntax lambda c++11

264
推荐指数
1
解决办法
1万
查看次数

为什么C++没有垃圾收集器?

我不是问这个问题,因为垃圾收集的优点首先.我提出这个问题的主要原因是我知道Bjarne Stroustrup已经说过C++在某些时候会有一个垃圾收集器.

话虽如此,为什么还没有添加?已经有一些垃圾收集器用于C++.这只是那些"说起来容易做起来难"的事情吗?还是有其他原因没有添加(并且不会在C++ 11中添加)?

交叉链接:

为了澄清,我理解为什么C++在第一次创建时没有垃圾收集器的原因.我想知道为什么收藏家不能加入.

c++ garbage-collection c++11

258
推荐指数
11
解决办法
15万
查看次数

一个积极的lambda:'+ [] {}' - 这是什么巫术?

在Stack Overflow问题中,在C++ 11中不允许重新定义lambda,为什么?,给出了一个不编译的小程序:

int main() {
    auto test = []{};
    test = []{};
}
Run Code Online (Sandbox Code Playgroud)

问题得到了回答,一切似乎都很好.然后是Johannes Schaub并做了一个有趣的观察:

如果你+在第一个lambda之前放置一个,它会神奇地开始工作.

所以我很好奇:为什么以下工作呢?

int main() {
    auto test = +[]{}; // Note the unary operator + before the lambda
    test = []{};
}
Run Code Online (Sandbox Code Playgroud)

它与GCC 4.7+和Clang 3.2+都很好.代码标准是否符合要求?

c++ lambda operator-overloading language-lawyer c++11

255
推荐指数
1
解决办法
3万
查看次数

我们应该通过引用还是通过值传递shared_ptr?

当一个函数采用shared_ptr(来自boost或C++ 11 STL)时,你传递它:

  • 通过const引用: void foo(const shared_ptr<T>& p)

  • 或按价值:void foo(shared_ptr<T> p)

我更喜欢第一种方法,因为我怀疑它会更快.但这真的值得吗还是还有其他问题吗?

您能否说出您选择的原因或案例,为什么您认为无关紧要.

c++ boost shared-ptr c++11

253
推荐指数
8
解决办法
10万
查看次数