2011-01-15 1 views
0

У меня есть класс (упрощенный):C++ назначение удаляет источник приписанного значения

class a { 
    private: 
    std::vector<a> arguments; 
    public: 
    std::vector<a> getargs() { return arguments; } 
}; 

Предположим, что класс имеет функцию-член:

void a::bubble() { 
    arguments = arguments[0].getargs(); 
} 

Является ли это кошерный (в том, что источник данные, аргументы [0], удаляются в результате команды)?

Он работает на моем компиляторе, но я просто хотел проверить, гарантирует ли безопасность эта операция.

+0

Возможно, вы захотите вернуться к исходной ссылке. –

ответ

1

Да, это нормально. Функция getargs() выполняется перед назначением. Он создает временное, существующее для жизни полного инструкции инструкции (все в;). Это временное значение используется при вызове оператора присваивания для std :: vector (также работает для сырых типов). Все кошерное и будет прекрасно работать.

+0

Спасибо. Что произойдет, если вы копируете действительно большой объект? Скажем, тот, который может поместиться дважды (один раз для оригинала, один раз для копии), но не трижды? Или копия просто связана с временным? Приветствия. – wyatt

+0

Ну, вы знаете, что они говорят ... «Размер не имеет значения». Я предположил, что какой-то предел внутри 'operator =' может вызвать проблему, если мы не будем говорить о std :: vector, а о какой-то третьей стороне - о чем-то. Что касается самого выражения, это не имеет значения. –

0

Почему это не будет законным? Конечно, вы все равно поедете к черту программиста, но опять же это не вы, это C++.

0

Я понятия не имею, что вы хотите сделать, но он должен работать нормально. Единственная проблема заключается в том, что вы должны быть уверены, что у вас есть хотя бы один элемент в аргументах.

+0

Для любопытства, это синтаксический анализатор языка, напоминающего язык. Если конкретный вызов имеет arity one, он просто заменяет вызов своим аргументом. Никакой оценки, как в lisp, так что это просто вопрос пузыря. – wyatt

Смежные вопросы