История изменений
Исправление KennyMinigun, (текущая версия) :
в какой современной реализации это не так?
Реализации метода я не нашел (даже в расширениях). Хотя с другой стороны, clang 6.0 на amd64 порешал все через constant propagation: https://godbolt.org/z/SQMa0E
#include <memory>
struct Foo {int bar;};
int f(std::unique_ptr<Foo> &ptr) {
ptr = std::make_unique<Foo>(Foo{4});
return ptr->bar;
}
int main() {
auto a = std::make_unique<Foo>(Foo{3});
return f(a) - 4;
}
/*
main: # @main
xor eax, eax
ret
*/
А GCC 8 таки не смог (даже с -O3): https://godbolt.org/z/0rsT0s
C другой стороны, я все же посыпаю голову пеплом, ибо f()
таки остался как и был (if (ptr) delete ptr; ptr = new
). Что, впрочем, не значит, что других оптимизаций не будет.
Исходная версия KennyMinigun, :
в какой современной реализации это не так?
Реализации метода я не нашел (даже в расширениях). Хотя с другой стороны, clang 6.0 на amd64 порешал все через constant propagation: https://godbolt.org/z/SQMa0E
#include <memory>
struct Foo {int bar;};
int f(std::unique_ptr<Foo> &ptr) {
ptr = std::make_unique<Foo>(Foo{4});
return ptr->bar;
}
int main() {
auto a = std::make_unique<Foo>(Foo{3});
return f(a) - 4;
}
А GCC 8 таки не смог (даже с -O3): https://godbolt.org/z/0rsT0s
C другой стороны, я все же посыпаю голову пеплом, ибо f()
таки остался как и был (if (ptr) delete ptr; ptr = new
). Что, впрочем, не значит, что других оптимизаций не будет.