Questions tagged «c++-faq»

提供协作式,社区编辑的C ++常见问题解答

2
什么是“跨度”?何时使用?
最近,我得到了span<T>在代码中使用的建议,或者在网站上看到了使用spans的答案-据说是某种容器。但是-我在C ++ 17标准库中找不到类似的东西。 那么,这是什么神秘的东西?span<T>为什么(如果不标准)使用它是一个好主意?

4
何时使用哪种指针?
好的,所以我上一次写C ++为生时,std::auto_ptr所有的std lib都可用,而且boost::shared_ptr风靡一时。我从来没有真正研究过提供的其他智能指针类型。我知道C ++ 11现在提供了某些类型的boost,但不是全部。 那么,有人可以通过简单的算法来确定何时使用哪个智能指针吗?最好包括有关哑指针(原始指针,如T*)和其他Boost智能指针的建议。(喜欢的东西这将是巨大的)。

11
非常量引用为什么不能绑定到临时对象?
为什么不允许获得对一个临时对象的非常量引用,哪个函数getx()返回?显然,这是C ++标准所禁止的,但是我对这种限制的目的感兴趣,而不是对该标准的引用。 struct X { X& ref() { return *this; } }; X getx() { return X();} void g(X & x) {} int f() { const X& x = getx(); // OK X& x = getx(); // error X& x = getx().ref(); // OK g(getx()); //error g(getx().ref()); //OK return 0; …



3
什么是C ++中的<=>运算符?
当我试图了解C ++运算符,我偶然发现了一个奇怪的比较操作上cppreference.com,*在一个看起来像这样的表: 我想:“好吧,如果它们是C ++中的常用运算符,我最好学习它们。” 但是我为阐明这个奥秘所做的所有尝试都没有成功。即使在这里,在Stack Overflow上我也没有运气。 &lt;=&gt;和C ++之间是否有连接? 如果有的话,这个运算符的作用是什么? *同时,cppreference.com更新了该页面,现在包含有关&lt;=&gt;运算符的信息。

11
C ++程序员应该知道哪些常见的未定义行为?[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,因此不能以当前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 7年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 C ++程序员应该知道哪些常见的未定义行为? 像这样说: a[i] = i++;

3
为什么我必须通过this指针访问模板基类成员?
如果下面的类不是模板,那么我可以简单地x在derived该类中使用。但是,在下面的代码中,我必须使用this-&gt;x。为什么? template &lt;typename T&gt; class base { protected: int x; }; template &lt;typename T&gt; class derived : public base&lt;T&gt; { public: int f() { return this-&gt;x; } }; int main() { derived&lt;int&gt; d; d.f(); return 0; }


9
C ++ 11中弃用了哪些C ++习惯用法?
有了新标准,就有了新的做事方法,许多方法都比旧方法好,但是旧方法仍然可以。显然,出于向后兼容的原因,新标准并未正式弃用。因此,剩下的问题是: 哪种旧的编码方式绝对不如C ++ 11风格,我们现在可以做什么? 在回答这个问题时,您可以跳过一些明显的事情,例如“使用自动变量”。
192 c++  c++11  c++-faq 



2
为什么“ this”是指针而不是引用?
我在阅读有关C ++优缺点的问题的答案,并在阅读注释时遇到了疑问。 程序员经常发现“ this”是一个指针而不是一个引用令人困惑。另一个困惑是为什么“ hello”不是std :: string类型,而是求值为char const *(指针)(在数组到指针的转换之后)– Johannes Schaub-litb 08年12月22日在1:56 这仅表明它没有使用与其他(后来的)语言相同的约定。– le dorfier 08年12月22日在3:35 我将“这个”事情称为一个非常琐碎的问题。糟糕,感谢您在我的未定义行为示例中发现了一些错误。:)尽管我不了解有关尺寸的信息与第一个信息有关。完全不允许指针指向已分配的内存之外– jalf 08年12月22日在4:18 这是持续不断的痛苦吗?– yesraaj 08年12月22日下午6:35 如果方法是const int getFoo()const,则它可以是常量。&lt;-在getFoo的范围内,“ this”是常量,因此是只读的。这样可以防止错误,并为调用者提供一定程度的保证,即该对象不会更改。– Doug T. 08年12月22日在16:42 您不能重新分配“此”。即您不能执行“ this =&other;”,因为这是一个右值。但这是T *类型,而不是T const类型。即它是一个非恒定指针。如果您使用的是const方法,则它是指向const的指针。T常量 但指针本身是非常量– Johannes Schaub-litb 08年12月22日在17:53 可以这样想“ this”:#define this(this_ + 0),其中编译器创建“ this_”作为指向对象的指针,并使“ this”成为关键字。您不能分配“ this”,因为(this_ + 0)是一个右值。当然不是这样的(没有这样的宏),但是它可以帮助理解它– Johannes Schaub-litb …

2
安全布尔习语在C ++ 11中过时了吗?
@R的答案。Martinho Fernandes表明,C ++ 11中不赞成使用安全布尔习语,因为可以用一个简单的方法代替它 explicit operator bool() const; 根据答案中的标准报价§4 [conv] p3: T当且仅当声明T t=e;的格式正确(对于某些发明的临时变量t(第8.5节))时,表达式e才能隐式转换为类型。某些语言构造要求将表达式转换为布尔值。表达式e出现在这样的背景下被说成是上下文转换到bool和良好成形的当且仅当该声明bool t(e);是良好的形成,对于某些发明临时变量t(第8.5节)。 高亮部分清楚地将“隐式显式强制转换”(在标准中称为“上下文转换”)显示为@R。马丁尼奥说。 要求“隐式显式强制转换”的“某些语言构造”如下所示: if,while,for(§6.4 [stmt.select] p4) 二进制逻辑运算符&amp;&amp;和||(§5.14 [expr.log.and/or] p1两者) 逻辑否定运算符!(§5.3.1 [expr.unary.op] p9) 条件运算符?:(§5.14 [expr.cond] p1) static_assert(§7 [dcl.dcl] p4) noexcept(§15.4 [except.spec] p2) 我们标题中的假设正确吗?我希望我们不要忽视任何潜在的缺点。


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.