"最重要的const"与auto_ptr:为什么代码不能编译?

pae*_*bal 6 c++ auto-ptr c++11 c++98

以下代码不能在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?
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

CB *_*ley 13

在C++ 03和C++ 98中,当将const引用绑定到rvalue(例如通过value返回的函数)时,实现可以将引用直接绑定到rvalue,或者它可以复制rvalue和bind对该副本的引用.由于auto_ptr复制构造函数采用非const引用,第二种选择只有在返回的rvalue const不合格但仍允许编译器尝试此操作时才有效,即使它不起作用.

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

另见这里.