LINUX.ORG.RU

История изменений

Исправление 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). Что, впрочем, не значит, что других оптимизаций не будет.