#include <iostream>
#include <string>
#include <memory>
#include <cstdlib>
std::string foo()
{
return std::string("yyyyyyyyyyyyy");
}
void bar(std::string& s)
{
std::cout << s << std::endl;
}
std::auto_ptr<std::string> foo1()
{
bool x = std::rand() % 2;
if (x) {
return std::auto_ptr<std::string>(new std::string("eeeeeeeeeeee"));
} else {
return std::auto_ptr<std::string>(new std::string("aaaaaaaaaaaaa"));
}
}
int main()
{
//bar(foo());
std::auto_ptr<std::string> a(foo1());
}
bar가 비 const 참조를 허용하고 foo
이 rvalue를 반환하기 때문에 주석 처리 된 행 : bar(foo())
이 컴파일되지 않습니다. 그러나 std::auto_ptr
의 두 번째 줄이 컴파일됩니다. std::auto_ptr
의 복사 생성자는 비 const 참조도 허용합니다. 왜 컴파일됩니까? 나는 foo1
에 std::rand()
을 사용하여 RVO (반환 값 최적화)를 제거했습니다.std :: auto_ptr은 rvalue로 어떻게 초기화됩니까?
[FYI] '표준 : auto_ptr'이 중단된다. 그것은'std :: unique_ptr'와'std :: shared_ptr'로 대체되었습니다. – NathanOliver
알다시피 그래도 오래된 컴파일러를 사용해야합니다. – Ashot
그런 다음 C++ 98 또는 C++ 03을 지정할 수 있습니다. C++ 자체에는 현재 표준 인 C++ 14가 포함되어 있습니다. – NathanOliver