返回auto_ptr在不同的gcc版本上有不同的结果

时间:2017-06-22 18:12:22

标签: c++ gcc auto-ptr

我有以下测试代码,我尝试使用gcc 4.4.2在QNX 6.5.0SP1上运行:

// auto_ptr::operator= example
#include <iostream>
#include <cstdio>
#include <memory>

std::auto_ptr<std::string> source(void)
{
  return std::auto_ptr<std::string>(new std::string("Hello World!\n"));
}

void sink(std::auto_ptr<std::string> arg)
{

}

int main () {
  std::auto_ptr<std::string> ap1 = source();// = ( new std::string("Hello World!\n"));
  std::auto_ptr<std::string> ap2 = source();
  std::printf("AP1 = %08d\nAP2 = %08d\n\n",ap1.get(), ap2.get());

   ap1 = source();
   std::printf("AP1 = %08d\nAP2 = %08d\n\n",ap1.get(), ap2.get());


  ap2 = ap1;
  std::printf("AP1 = %08d\nAP2 = %08d\n\n",ap1.get(), ap2.get());

  sink(ap2);
  std::printf("AP1 = %08d\nAP2 = %08d\n\n",ap1.get(), ap2.get());

  return 0;
}

编译时出现以下错误:

helloworld_app.cpp:28: error: no match for 'operator=' in 'ap1 = source()()'
note: candidates are:
std::auto_ptr<_Ty>& std::auto_ptr<_Ty>::operator=(std::auto_ptr<_Other>&) [with _Other = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Ty = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]
std::auto_ptr<_Ty>& std::auto_ptr<_Ty>::operator=(std::auto_ptr<_Ty>&) [with _Ty = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]
std::auto_ptr<_Ty>& std::auto_ptr<_Ty>::operator=(std::auto_ptr_ref<_Ty>&) [with _Ty = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]

我尝试使用gcc 5.4.0在本地计算机上通过cygwin成功运行此代码,并使用gcc 4.9.2在http://cpp.sh/上运行。 gcc的版本是否存在阻止函数返回值与另一个本地auto_ptr的auto_ptr分配的差异?任何见解都会有所帮助。

我已经看过以下两个问题并阅读了关于auto_ptrs的Herb Stutters帖子,并且觉得我理解他们所说的关于副本不相等的内容,但是对于为什么它在不同版本上看起来表现不同而感到困惑GCC。

http://www.gotw.ca/publications/using_auto_ptr_effectively.htm

Is returning auto_ptr from functions wrong/error-prone?

How do you assign a returned auto_ptr?

0 个答案:

没有答案