Tag: c + + faq

传递共享指针作为参数

如果我声明一个包装在共享指针中的对象: std::shared_ptr<myClass> myClassObject(new myClass()); 那么我想把它作为一个parameter passing给一个方法: DoSomething(myClassObject); //the called method void DoSomething(std::shared_ptr<myClass> arg1) { arg1->someField = 4; } 以上是否简单地增加了shared_pt的引用计数,一切都很酷? 还是会留下一个晃来晃去的指针? 你还是应该这样做吗? DoSomething(myClassObject.Get()); void DoSomething(std::shared_ptr<myClass>* arg1) { (*arg1)->someField = 4; } 我认为第二种方法可能更有效率,因为它只需要复制1个地址(而不是整个智能指针),但是第一种方式看起来更具可读性,我不希望推行性能限制。 我只是想确保没有什么危险的事情。 谢谢。

什么时候额外的括号会影响运算符的优先级?

C ++中的括号用在许多地方:例如在函数调用和分组expression式中覆盖运算符优先级。 除了非法的额外括号 (比如函数调用参数列表)之外,C ++的一个通用但不是绝对的规则就是额外的括号不会受到伤害 : 5.1主expression式[expr.prim] 5.1.1一般[expr.prim.general] 6加括号的expression式是一个主expression式,其types和值与所附expression式的types和值相同。 括号的存在不影响expression式是否左值。 带括号的expression式可以用在与包含的expression式可以使用的expression式完全相同的上下文中, 除非另有说明,否则使用相同的含义。 问题 :除了覆盖基本的运算符优先级之外,在哪些上下文中,额外的括号会改变C ++程序的含义? 注 :我认为指针到成员语法限制为不带圆括号的&qualified-id超出范围,因为它限制了语法,而不是允许两个含义不同的语法。 同样, 在预处理器macros定义中使用括号也可以防止不需要的运算符优先级。

何时在C ++ 11中创build一个不可移动的types?

我很惊讶这没有出现在我的search结果中,我以为有人会问这之前,考虑到在C + + 11的移动语义的有用性: 我什么时候需要(或者对我来说是一个好主意)在C ++ 11中创build一个不可移动的类? (除现有代码的兼容性问题之外的原因,即。)

使用nullptr有什么好处?

这段代码在概念上对三个指针(安全指针初始化)做同样的事情: int* p1 = nullptr; int* p2 = NULL; int* p3 = 0; 那么,分配指针nullptr的优点是分配NULL或0值呢?

什么是“右值参考”?

在clang的C ++ 11状态页面中find了一个叫做“* this的右值引用”的提议。 我读了很多关于右值的引用并理解了它们,但我不认为我知道这个。 我也无法使用这些条款在网上find很多资源。 有一个链接到页面上的提案文件: N2439 (将移动语义扩展到*这个),但我也没有从那里得到很多例子。 这个function是关于什么的?

向非C ++程序员解释C ++ SFINAE

什么是C ++中的SFINAE? 你可以用一个对C ++不熟练的程序员来解释吗? 此外,SFINAE对应于像Python这样的语言中的什么概念?

为什么要replace默认的新的和删除操作符?

为什么要用一个自定义的new和delete操作符来replace默认的操作符new和delete ? 这是在重载 C ++ FAQ中重载和删除的延续: 运算符重载。 此常见问题解答的后续条目是: 我应该如何编写符合ISO C ++标准的自定义new和delete操作符? 注意:答案是基于Scott Meyers的“更有效的C ++”的教训。 (注意:这是一个Stack Overflow的C ++常见问题解答的入口,如果你想批评在这个表单中提供FAQ的想法,那么在这个开始所有这些的meta上的贴子将是这个地方的答案。那个问题在C ++聊天室中进行监控,常见问题解决scheme首先出现,所以你的答案很可能会被那些提出这个想法的人阅读)。

为什么`std :: move`命名为`std :: move`?

C ++ 11 std::move(x)函数根本就不移动任何东西。 这只是一个演员r值。 为什么这样做? 这不是误导?

在C ++中的对象破坏

什么时候在C ++中被销毁的对象,这是什么意思? 我是否必须手动销毁它们,因为没有垃圾收集器? exception如何发挥作用? (注意:这是一个Stack Overflow的C ++常见问题解答的入口,如果你想批评在这个表单中提供FAQ的想法,那么在这个开始所有这些的meta上的贴子将是这个地方的答案。那个问题在C ++聊天室中进行监控,常见问题解决scheme首先出现,所以你的答案很可能会被那些提出这个想法的人阅读)。

在C ++ 11中,安全布尔成语是否过时?

@R的这个答案。 马丁·费尔南德斯(Martinho Fernandes)表示,安全布尔成语在C ++ 11中被明显弃用,因为它可以被简单的 explicit operator bool() const; 根据答案§4 [conv] p3的标准报价: 一个expression式e可以被隐含地转换为一个typesT当且仅当声明T t=e; 对于一些发明的临时variablest (§8.5)来说,是格式良好的。 某些语言结构要求将expression式转换为布尔值。 出现在这样的语境中的expression式e据说被上下文转换为bool , 并且当且仅当声明bool t(e); 对于一些发明的临时variablest(§8.5)来说, 是格式良好的 。 突出显示的部分清楚地显示了“隐式显式强制转换”(在标准中称为“上下文转换”)为@R。 马蒂尼说的。 需要“隐式显式投射”的“某些语言结构”似乎是: if , while ,( §6.4 [stmt.select] p4 ) 二进制逻辑运算符&&和|| ( §5.14 [expr.log.and/or] p1 ) 逻辑否定运算符! ( §5.3.1 [expr.unary.op] p9 ) 条件运算符?: §5.14 [expr.cond] p1 ) static_assert ( §7 […]