我有以下测试代码,我尝试使用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