Tag: c ++ 11

如何在不使用<mutex>的情况下在C ++ 11中实现multithreading安全单例

现在,C + + 11有multithreading,我想知道什么是正确的方式来实现惰性初始化单例没有使用互斥(出于原因)。 我想出了这个,但是tbh我不擅长编写无锁的代码,所以我正在寻找一些更好的解决scheme。 // ConsoleApplication1.cpp : Defines the entry point for the console application. // # include <atomic> # include <thread> # include <string> # include <iostream> using namespace std; class Singleton { public: Singleton() { } static bool isInitialized() { return (flag==2); } static bool initizalize(const string& name_) { if (flag==2) return […]

如何在我的dll界面或ABI中使用标准库(STL)类?

在导出一个包含stl类的类与Visual Studio警告C4251有关的几个问题之前:例如这个问题或这个问题。 我已经阅读了UnknownRoad的优秀解释。 一味地禁用警告似乎有点危险,虽然它可能是一个选项。 包装所有这些std类并导出这些也不是一个真正的select。 毕竟它被称为标准模板库…也就是说,我们想要提供一个与这些标准类的接口。 我如何在我的dll界面中使用stl-classes? 什么是常见的做法?

在C ++中,从函数返回一个向量还是不好的做法吗?

简短版本:在许多编程语言中返回大型对象(如向量/数组)很常见。 如果这个类有一个移动构造函数,或者C ++程序员认为它是奇怪/丑陋/可憎的,现在这种风格现在可以被C ++ 0x接受吗? 长版本:在C + + 0x这是仍然认为不好的forms? std::vector<std::string> BuildLargeVector(); … std::vector<std::string> v = BuildLargeVector(); 传统版本看起来像这样: void BuildLargeVector(std::vector<std::string>& result); … std::vector<std::string> v; BuildLargeVector(v); 在较新的版本中,从BuildLargeVector返回的值是一个右值,因此v将使用std::vector的移动构造函数构造,假设(N)RVO不会发生。 甚至在C ++ 0x之前,由于(N)RVO,第一种forms往往是“高效的”。 但是,(N)RVO由编译器自行决定。 现在我们有了右值引用, 保证不会发生深度复制。 编辑 :问题实际上不是关于优化。 所显示的两种forms在现实世界的程序中都具有几乎相同的性能。 而过去,第一种forms的performance可能会有数量级的下滑。 因此,第一种forms在很长一段时间里是C ++编程中的主要代码异味。 现在不行了,我希望?

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

()循环的C ++ 11基于范围的常见示例总是如此简单: std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 }; for ( auto xyz : numbers ) { std::cout << xyz << std::endl; } 在这种情况下, xyz是一个int 。 但是,当我们有像地图一样的东西时会发生什么? 这个例子中variables的types是什么: std::map< foo, bar > testing = { /*…blah…*/ }; for ( auto abc : testing ) { std::cout << abc << […]

什么时候是std :: weak_ptr有用?

我开始研究C ++ 11的智能指针,我没有看到任何有用的std::weak_ptr 。 有人可以告诉我什么时候std::weak_ptr是有用的/必要的?

这是无限的recursionUB吗?

在C ++ 11中,作为一个没有副作用的死循环,下面的程序是UB: int main() { while (true) {} } 以下也是UB吗? void foo() { foo(); } int main() { foo(); } 从这两个scheme的标准引用将是理想的。

移动是否使对象处于可用状态?

说我有两个向量,我移动到另一个, v1 = std::move(v2) ; v2还会在这之后处于可用状态吗?

是在GCC 4.x / C ++ 11中的std :: string refcounted?

当使用gcc 4与-std=c++0x或-std=c++11时, std::string引用被计数吗?

是否使用lambda函数/expression式支持constexpr?

struct Test { static const int value = []() -> int { return 0; } (); }; 有了gcc-4.6,我得到了类似的error: function needs to be constexpr 。 我尝试过在各个地方放置constexpr多种组合,但没有运气。 是否也支持lambda函数的constexpr (不pipe是否指定returntypes)? 什么是正确的语法? 任何可能的工作?

在C ++中,哪些类(左值,右值,左值等)可以生成临时types的expression式?

以下是一些示例代码: #include <iostream> class Foo { public: explicit Foo(int x) : data(x) {}; Foo& operator++() { data += 1; return *this; } void *get_addr() { return (void*)this; } friend Foo operator + (const Foo& lhs, const Foo& rhs); friend std::ostream& operator << (std::ostream& os, const Foo& f); private: int data; }; std::ostream& operator << (std::ostream& […]