const foo::Bar& myfunc();
В своем C-адаптере я переопределяю ее так:
const foo_Bar_t* myfunc();
Вообще говоря, это уже неопределенное поведение, потому что стандарт не гарантирует, что ссылки будут реализованы посредством указателей.
Правильно ли я понимаю, что я не могу хранить этот указатель после возврата из функции?
Все зависит от того, что делает функция:
const int g = 1;
struct S
{
const int & foo() const
{
return v;
}
const int & bar() const
{
return g;
}
int v = 0;
};
const int & foobar()
{
S s;
//return s.foo(); // oops
return s.bar(); //ok
}
int main(int argc, char const *argv[])
{
return foobar();
}
Дальше у вас идет некорректный код:
Как должен работать
static_cast от std::auto_ptr<Baz>*
в
Baz
?
Я предполагаю, что у вас там на самом деле написано:
this->operator=(*static_cast<BazAutoPtr*>(&std::auto_ptr<element_type>(Baz_Constructor())));
Что в общем тоже неопределенное поведение, потому что
—
error: taking address of temporary
—
static_cast
объекта к типу, объектом которого он на самом деле не является.
Выражать эта конструкция должна была видимо примерно то же, что и
inline BazAutoPtr():std::auto_ptr<Baz>(Baz_Constructor()){}
В общем, самый дельный совет тут — завязывать с кодом, в котором такое написно.