Questions tagged «c++11»

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

4
为什么没有默认的移动分配/移动构造函数?
我是一个简单的程序员。我的班级成员变量通常由POD类型和STL容器组成。因此,我很少需要编写赋值运算符或复制构造函数,因为它们是默认实现的。 此外,如果我std::move在不可移动的对象上使用它,则使用赋值运算符,这std::move是绝对安全的。 因为我是一个简单的程序员,所以我想利用移动功能,而不必在我编写的每个类中添加移动构造函数/赋值运算符,因为编译器可以将它们简单地实现为“ this->member1_ = std::move(other.member1_);...” 但这不是(至少在Visual 2010中不是),是否有任何特殊原因? 更重要的是; 有什么办法可以解决这个问题? 更新: 如果您不看GManNickG的答案,他为此提供了一个很好的宏。如果您不知道,如果您实现了移动语义,则可以删除掉swap成员函数。

3
这是C ++ 11 for循环的已知陷阱吗?
让我们想象一下,我们有一个结构可以容纳带有某些成员函数的3个double: struct Vector { double x, y, z; // ... Vector &negate() { x = -x; y = -y; z = -z; return *this; } Vector &normalize() { double s = 1./sqrt(x*x+y*y+z*z); x *= s; y *= s; z *= s; return *this; } // ... }; 为了简化起见,这有点人为设计,但是我敢肯定您同意类似的代码已经存在。这些方法使您可以方便地进行链接,例如: Vector v …

3
不赞成使用static关键字…不再吗?
在C ++中,可以static在翻译单元中使用关键字来影响符号(变量或函数声明)的可见性。 在n3092中,已弃用: 附件D.2 [depr.static] 在命名空间范围内声明对象时,不建议使用static关键字(请参阅3.3.6)。 在n3225中,已将其删除。 在我能找到的唯一的文章是有点非正式的。 它确实强调了,为了与C兼容(以及将C程序编译为C ++的能力),弃用是令人讨厌的。但是,直接将C程序编译为C ++可能会令人沮丧,因此我不确定是否值得考虑。 有谁知道为什么要更改?
89 c++  static  c++11  standards 

3
什么是const void?
std::is_void状态描述为: 如果T是类型void,const void,volatile void或const volatile void ,则提供等于true的成员常数值。 那么这可能是const void,或volatile void? 此答案指出const void返回类型将无效(但是在VC ++ 2015上编译) const void foo() { } 如果按照标准,const void是无效的(VC错误),那么什么是const void?
89 c++  c++11  c++14 

4
如何存储可变参数模板参数?
是否可以以某种方式存储参数包以备后用? template <typename... T> class Action { private: std::function<void(T...)> f; T... args; // <--- something like this public: Action(std::function<void(T...)> f, T... args) : f(f), args(args) {} void act(){ f(args); // <--- such that this will be possible } } 然后稍后: void main(){ Action<int,int> add([](int x, int y){std::cout << (x+y);}, 3, …


3
什么时候私有构造函数不是私有构造函数?
假设我有一个类型,并且想将其默认构造函数设为私有。我写以下内容: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // …

6
函数返回lambda表达式
我想知道是否有可能在C ++ 11中编写一个返回lambda函数的函数。当然,一个问题是如何声明这种功能。每个lambda都有一个类型,但是该类型在C ++中无法表达。我认为这不起作用: auto retFun() -> decltype ([](int x) -> int) { return [](int x) { return x; } } 也没有: int(int) retFun(); 我不知道从lambda到函数指针等的任何自动转换。唯一的解决方案是手工制作函数对象并返回它吗?
88 c++  function  c++11  lambda 

6
为什么我不能在C ++ 11中创建Lambda向量(相同类型)?
我试图创建一个lambda向量,但是失败了: auto ignore = [&]() { return 10; }; //1 std::vector<decltype(ignore)> v; //2 v.push_back([&]() { return 100; }); //3 直到第2行,它编译正常。但是第3行给出了编译错误: 错误:没有匹配的函数调用'std :: vector <main():: <lambda()>> :: push_back(main():: <lambda()>)' 我不需要函数指针的向量或函数对象的向量。但是,封装真正的lambda表达式的功能对象的矢量对我有用。这可能吗?
88 c++  vector  lambda  c++11 

3
默认值和零初始化混乱
我对value-&default-&zero-initialization感到非常困惑。特别是当他们采用不同的标准C ++ 03和C ++ 11(和C ++ 14)时。 我在这里引用并尝试扩展一个很好的答案Value- / Default- / Zero-Init C ++ 98和C ++ 03,使其更通用,因为如果有人可以帮助填写,它将对很多用户有所帮助需要差距才能很好地了解何时会发生什么? 简而言之,通过示例全面了解: 有时由new运算符返回的内存将被初始化,有时并不取决于您要更新的类型是POD(普通旧数据),还是它是包含POD成员并且正在使用a的类。编译器生成的默认构造函数。 在C ++ 1998中,有两种初始化类型:零初始化和默认初始化 在C ++ 2003中,第三种初始化类型是值初始化。 在C ++ 2011 / C ++ 2014中,仅添加了列表初始化,并且value- / default- / zero-initialization的规则有所更改。 承担: struct A { int m; }; struct B { ~B(); int m; }; …
88 c++  c++11  c++14  c++03  c++98 

5
std :: shared_ptr是否具有非原子等效项?为什么<memory>中没有一个?
这是一个由两部分组成的问题,全部有关std::shared_ptr: 1. 据我所知,std::shared_ptr是唯一的智能指针在&lt;memory&gt;这原子。我想知道是否有std::shared_ptr可用的非原子版本(我在中看不到任何内容&lt;memory&gt;,所以我也愿意接受标准之外的建议,例如Boost中的建议)。我知道boost::shared_ptr也是原子的(如果BOOST_SP_DISABLE_THREADS未定义),但是也许还有另一种选择?我正在寻找具有与相同语义std::shared_ptr但没有原子性的东西。 2.我理解为什么std::shared_ptr是原子的;很好。但是,这并不是在每种情况下都很好,并且C ++历来有“只为所用内容付费”的口号。如果我不使用多个线程,或者如果我使用多个线程但不跨线程共享指针所有权,那么原子智能指针就显得过分了。我的第二个问题是,为什么std::shared_ptrC ++ 11中没有提供非原子版本的?(假设有一个原因)(如果答案仅仅是“根本就没有考虑过非原子版本”或“没有人问过非原子版本”就可以了!)。 对于问题2,我想知道是否有人提出了非原子版本的shared_ptr(向Boost或标准委员会提出)(不是取代原子版本的shared_ptr,而是与之共存)而被否决了。具体原因。

5
将共享指针作为参数传递
如果我声明一个包装在共享指针中的对象: std::shared_ptr&lt;myClass&gt; myClassObject(new myClass()); 然后我想将其作为方法的参数传递: DoSomething(myClassObject); //the called method void DoSomething(std::shared_ptr&lt;myClass&gt; arg1) { arg1-&gt;someField = 4; } 上面是否只是简单地增加了shared_pt的引用计数,并且一切都很酷?还是留下一个悬空的指针? 您仍然应该这样做吗?: DoSomething(myClassObject.Get()); void DoSomething(std::shared_ptr&lt;myClass&gt;* arg1) { (*arg1)-&gt;someField = 4; } 我认为第二种方法可能更有效,因为它只需要复制1个地址(而不是整个智能指针),但是第一种方法似乎更具可读性,并且我预计不会出现性能限制。我只想确保它没有危险。 谢谢。


5
在Linux下的GCC中使用std :: thread的正确链接选项是什么?
嗨,我正在尝试std::thread与G ++一起使用。这是我的测试代码 #include &lt;thread&gt; #include &lt;iostream&gt; int main(int, char **){ std::thread tt([](){ std::cout&lt;&lt;"Thread!"&lt;&lt;std::endl; }); tt.join(); } 它可以编译,但是当我尝试运行它时,结果是: terminate called after throwing an instance of 'std::system_error' what(): Operation not permitted Aborted 我的编译器版本: $ g++ --version g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see …


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.