Ситуация заключается в том, что не могу отключить 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. Или применить какую-нибудь другую оптимизацию.
В любом случае, не следует использовать побочные эффекты при копировании, оно для этого не предназначено.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Каким образом в Visual Studio Code можно организовать компиляцию многофайлового проектаК примеру имеется 3 файла: main
В общем, такая задача: Сделать окно и поместить в него некоторую невидимую область и сделать так, чтобы при приближении к этой области курсора...