решил использовать auto_ptr_ref и обнаружил интересное поведение, что на разных компиляторах получаются разные значения, пример кода:
template<class T> std::auto_ptr_ref<T> function(std::auto_ptr_ref<T> p)
{
std::auto_ptr<T> p1(p);
std::cout<<typeid(T).name()<<" "<<p1.get()<<std::endl;
return p1;
}
int main()
{
std::auto_ptr<int> p(new int(123));
p = function<int>(p);
}
на gcc все работает отлично, но реализация auto_ptr_ref не соответствует описанной в стандарте по С++

на cl 8 от майка все падает, поскольку auto_ptr_ref соответсвует стандарту по С++

Цитата из стандарта:
"Template auto_ptr_ref holds a reference to an auto_ptr. It is used by the auto_ptr conversions
to allow auto_ptr objects to be passed to and returned from functions."
соответственно возвращать из функции ссылку на что-то непонятное очень нехорошо...
соответственно на майке если сделать статической p1 в функции function то все будет работать.
Вот я и думаю, кто же в этом случае не прав — я (как всегда

), майк, gcc или, блин, стандарт какую-то фигню описывает?
Здравствуйте, jdan, Вы писали:
J>решил использовать auto_ptr_ref и обнаружил интересное поведение, что на разных компиляторах получаются разные значения, пример кода:
[snipped]
J>на gcc все работает отлично, но реализация auto_ptr_ref не соответствует описанной в стандарте по С++
J>на cl 8 от майка все падает, поскольку auto_ptr_ref соответсвует стандарту по С++
J>Цитата из стандарта:
J>"Template auto_ptr_ref holds a reference to an auto_ptr. It is used by the auto_ptr conversions
J>to allow auto_ptr objects to be passed to and returned from functions."
J>соответственно возвращать из функции ссылку на что-то непонятное очень нехорошо...
J>соответственно на майке если сделать статической p1 в функции function то все будет работать.
J>Вот я и думаю, кто же в этом случае не прав — я (как всегда
), майк, gcc или, блин, стандарт какую-то фигню описывает?
auto_ptr_ref не предназначен для непосредственного использования, он нужен для того чтобы такой код работал и всё:
std::auto_ptr<int> foo();
void bar(std::auto_ptr<int>);
int main()
{
bar(foo());
}
Т.е. иметь возможность получить неконстантую ссылку на r-value

для последующей move semantics.