Questions tagged «c++11»

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

5
内联名称空间有什么用?
C ++ 11允许inline namespaces,其所有成员也自动包含在其中namespace。我想不出这有什么用处-有人可以举一个简短,简洁的例子来说明这种情况inline namespace是需要的,也是最惯用的解决方案吗? (另外,当发生了什么并不清楚,我namespace声明inline在一个但不是所有的声明,这可能住在不同的文件。这难道不是找麻烦?)

8
C ++ 11基于反向范围的for循环
是否有一个容器适配器可以颠倒迭代器的方向,以便我可以使用基于范围的for循环反向迭代容器? 使用显式迭代器,我可以将其转换为: for (auto i = c.begin(); i != c.end(); ++i) { ... 到这个: for (auto i = c.rbegin(); i != c.rend(); ++i) { ... 我想将其转换为: for (auto& i: c) { ... 对此: for (auto& i: std::magic_reverse_adapter(c)) { ... 有这样的事情还是我必须自己写?
321 c++  c++11  ranged-loops 



5
用成员函数启动线程
我正在尝试std::thread使用不带参数和返回值的成员函数构造一个void。我无法找出任何有效的语法-编译器会抱怨。什么是正确的实现方式spawn(),使其返回std::thread执行结果test()? #include <thread> class blub { void test() { } public: std::thread spawn() { return { test }; } };

8
C ++中make_shared和常规shared_ptr的区别
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo")); 关于此的许多google和stackoverflow帖子,但是我不明白为什么make_shared比直接使用效率更高shared_ptr。 有人可以一步一步地说明我创建的对象和它们所完成的操作的顺序,以便使我能够理解make_shared效率。我在上面给出了一个例子供参考。
276 c++  c++11  shared-ptr 

1
“ int main(){((([](){})());}”如何有效C ++?
最近,我遇到了以下深奥的代码。 int main(){(([](){})());} 重新格式化,如下所示以使其更具可读性: int main(){ (([](){})()); // Um... what?!?! } 但是我无法理解(([](){})())有效代码的有效性。 它看起来不像函数指针语法。 这不可能是操作员重载的把戏。代码按原样编译。 Google在这种全符号搜索中并没有太大帮助。但是它可以在Visual Studio 2010中编译,但不输出任何内容。没有错误,也没有警告。因此,它看起来像有效的代码。 在Javascript和C函数指针之外,我从未见过任何如此奇怪的有效代码。 有人可以解释这是如何有效的C ++吗?
271 c++  c++11  lambda  syntax 

10
我们应该按引用还是按值传递shared_ptr?
当一个函数接受一个shared_ptr(来自boost或C ++ 11 STL)时,是否要传递它: 通过const参考: void foo(const shared_ptr<T>& p) 或值:void foo(shared_ptr<T> p)? 我更喜欢第一种方法,因为我怀疑它会更快。但这真的值得吗?还是有其他问题? 请问您提供选择的理由,或者如果是这种情况,请说明原因。
269 c++  c++11  boost  shared-ptr 

16
为什么C ++没有垃圾回收器?
首先,因为垃圾收集的优点,所以我没有问这个问题。我提出这个问题的主要原因是,我确实知道Bjarne Stroustrup曾说过C ++将在某个时间点具有垃圾收集器。 话虽如此,为什么不添加呢?已经有一些C ++的垃圾收集器。这仅仅是那些“说起来容易做起来难”的事情之一吗?还是有其他原因未添加(并且不会在C ++ 11中添加)? 交叉链接: C ++垃圾收集器 为了澄清起见,我理解C ++首次创建时没有垃圾收集器的原因。我想知道为什么不能添加收集器。


10
在默认情况下,为什么C ++ 11的lambda要求“ mutable”关键字进行按值捕获?
简短示例: #include <iostream> int main() { int n; [&](){n = 10;}(); // OK [=]() mutable {n = 20;}(); // OK // [=](){n = 10;}(); // Error: a by-value capture cannot be modified in a non-mutable lambda std::cout << n << "\n"; // "10" } 问题:为什么我们需要mutable关键字?与传递给命名函数的传统参数完全不同。背后的原理是什么? 我给人的印象是,按值捕获的全部目的是允许用户更改临时值-否则,使用按引用捕获几乎总是更好,不是吗? 有什么启示吗? (顺便说一下,我正在使用MSVC2010。AFAIK,这应该是标准的)
256 c++  lambda  c++11 

8
“解包”一个元组以调用匹配的函数指针
我正在尝试存储std::tuple各种数量的值,这些值稍后将用作与存储类型匹配的函数指针的调用的参数。 我创建了一个简化的示例,显示了我正在努力解决的问题: #include <iostream> #include <tuple> void f(int a, double b, void* c) { std::cout << a << ":" << b << ":" << c << std::endl; } template <typename ...Args> struct save_it_for_later { std::tuple<Args...> params; void (*func)(Args...); void delayed_dispatch() { // How can I "unpack" params to call func? …

8
如何使我的自定义类型与“基于范围的循环”一起使用?
如今,像许多人一样,我一直在尝试C ++ 11带来的不同功能。我的最爱之一是“基于范围的循环”。 我明白那个: for(Type& v : a) { ... } 等效于: for(auto iv = begin(a); iv != end(a); ++iv) { Type& v = *iv; ... } 这begin()只是a.begin()标准容器的返回。 但是,如果我想使我的自定义类型“基于范围的循环”,可以怎么办? 如果我只是专注begin()和end()? 如果我的自定义类型属于名称空间xml,则应该定义xml::begin()还是std::begin()? 简而言之,这样做的准则是什么?

8
是否需要std :: unique_ptr <T>知道T的完整定义?
我在标头中有一些代码,如下所示: #include &lt;memory&gt; class Thing; class MyClass { std::unique_ptr&lt; Thing &gt; my_thing; }; 如果我在不包含Thing类型定义的cpp中包含此标头,则无法在VS2010-SP1下编译: 1&gt; C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ memory(2067):错误C2027:使用未定义类型'Thing' 替换std::unique_ptr为std::shared_ptr并编译。 因此,我猜测这是当前VS2010 std::unique_ptr的实现,需要完整的定义,并且完全依赖于实现。 还是?标准要求中是否有某些内容使得的实现无法std::unique_ptr仅与前向声明一起使用?感觉很奇怪,因为它只应持有一个指向的指针Thing,不是吗?

12
g ++(mingw)表示to_string不是std的成员
我正在制作一个小的词汇记忆程序,其中的单词会随机向我闪烁以获取含义。我想使用Bjarne Stroustroup告诉我们的标准C ++库,但是我遇到了一个看似陌生的问题。 我想将一个long整数更改为std::string以便能够将其存储在文件中。我已经雇用to_string()了相同的。问题是,当我用g ++(版本4.7.0,如其--‍version标志中所述)对其进行编译时,它说: PS C:\Users\Anurag\SkyDrive\College\Programs&gt; g++ -std=c++0x ttd.cpp ttd.cpp: In function 'int main()': ttd.cpp:11:2: error: 'to_string' is not a member of 'std' 我的程序出现此错误是: #include &lt;string&gt; int main() { std::to_string(0); return 0; } 但是,我知道这不可能,因为msdn库清楚地表明了它的存在,并且关于Stack Overflow(对于g ++版本4.5)的一个较早的问题说,可以使用该-std=c++0x标志将其打开。我究竟做错了什么?
245 c++  c++11  g++  mingw  tostring 

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.