c – “最重要的const”与auto_ptr:为什么代码不能编译?

c – “最重要的const”与auto_ptr:为什么代码不能编译?,第1张

概述以下代码无法在Visual C 2008和2010上编译: #include <memory>struct A {}; std::auto_ptr<A> foo() { return std::auto_ptr<A>(new A); }const std::auto_ptr<A> bar() { return std::auto_ptr<A>(new A); }int 以下代码无法在Visual C 2008和2010上编译:
#include <memory>struct A {};      std::auto_ptr<A> foo()  { return std::auto_ptr<A>(new A); }const std::auto_ptr<A> bar()  { return std::auto_ptr<A>(new A); }int main(){   const std::auto_ptr<A> & a = foo(); // most important const   const std::auto_ptr<A> & b = bar(); // error C2558:                                       // class 'std::auto_ptr<_Ty>' :                                       // no copy constructor available or copy                                       // constructor is declared 'explicit'                                bar(); // No error?}

我期望“最重要的const”应用于变量“b”,然而,它不会编译,并且由于某种原因,编译器要求复制构造函数(这让我感到惊讶,因为这里不应该涉及复制) .对bar()的独立调用工作正常,这意味着,我猜,实际上b的初始化是问题所在.

这是编译器错误,还是标准中描述的真正的编译错误?

(也许它在C 98中被禁止并在C 11中被授权?)

注意:它在Visual C 2012,gcc 4.6和Solaris CC(所有编译器……)上编译,但不是gcc 3.4,也不是XL C)

解决方法 在C 03和C 98中,当将const引用绑定到rvalue(例如通过值返回的函数)时,实现可以将引用直接绑定到rvalue,或者它可以生成rvalue的副本并将引用绑定到该值.复制.由于auto_ptr的复制构造函数采用非const引用,因此第二种选择仅在返回的rvalue不是const限定的情况下才有效,但仍允许编译器尝试此 *** 作,即使它不起作用.

在C 11中,不允许使用这些额外的副本,如果不需要转换,则实现必须直接绑定到rvalue.

See also here.

总结

以上是内存溢出为你收集整理的c – “最重要的const”与auto_ptr:为什么代码不能编译?全部内容,希望文章能够帮你解决c – “最重要的const”与auto_ptr:为什么代码不能编译?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1237574.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存