Ситуация заключается в том, что не могу отключить copy elision. В проекте присутствуют конструкторы с глобальными побочными эффектами. В результате "пропуска копии", при передаче в конструктор копирования объекта из функции - возникает поведение, которое недопустимо в имеющейся ситуации.
Необходимо производить некоторые действия во время вызова конструктора копирования. И вызов конструктора копирования должен происходить при копировании локального объекта перед выходом из функции, а затем - при копировании результата функции в другой объект.
Возможно ли отключить эту оптимизацию? Например, следующий пример (упрощенный) должен вызывать конструктор копии дважды:
T func(size_t Value)
{
T t { Value };
// ...
return t;// Первый вызов конструктора копии.
}
// ...
T t_var = func(x);// Второй вызов конструктора копии
Copy elision (aka RVO) для return работает только если выражение в return - это имя локальной не-volatile переменной (см. [class.copy] p31).
Используйте identity-функцию, тогда копирование при возврате значения не будет убираться.
template<typename T> const T& no_copy_elision(const T& t) { return t; }
T func() {
T t;
return no_copy_elision(t);
}
Либо можно попробовать использовать обычный static_cast<T>(t), или например в комбинации с volatile:
return static_cast<volatile T&>(t);
Однако VC++ может проигнорировать стандарт и всеравно сделать NRVO. Или применить какую-нибудь другую оптимизацию.
В любом случае, не следует использовать побочные эффекты при копировании, оно для этого не предназначено.
Продвижение своими сайтами как стратегия роста и независимости