Я не понимаю поведение gcc здесь, я ожидаю, что RVO будет применяться, но независимо от того, передам ли я флаги оптимизации и / или я передам -std=c++17
, во втором случае, кажется, что пара бесплатных фигурных скобок предотвращаетGCC от удаления копии.
$ cat /tmp/foo.cc
#include <iostream>
#define PING() std::cerr << __PRETTY_FUNCTION__ << '\n'
struct foo
{
foo() { PING(); }
~foo() { PING(); }
foo(const foo&) { PING(); }
};
foo bar()
{
PING();
foo res;
return res;
}
foo baz()
{
PING();
{
foo res;
return res;
}
}
int main()
{
foo f1 = bar();
foo f2 = baz();
}
$ g++-mp-7 -std=c++17 -O3 foo.cc
$ ./a.out
foo bar()
foo::foo()
foo baz()
foo::foo()
foo::foo(const foo&)
foo::~foo()
foo::~foo()
foo::~foo()
Разве это не должно быть частью гарантированного исключения копии?Поведение Clang соответствует моим ожиданиям:
$ clang++-mp-4.0 foo.cc
$ ./a.out
foo bar()
foo::foo()
foo baz()
foo::foo()
foo::~foo()
foo::~foo()