まず、2 つの翻訳単位で構成される次のコードを見てください。
--- foo.h ---
class Foo
{
public:
Foo();
Foo(const Foo& rhs);
void print() const;
private:
std::string str_;
};
Foo getFoo();
--- foo.cpp ---
#include <iostream>
Foo::Foo() : str_("hello")
{
std::cout << "Default Ctor" << std::endl;
}
Foo::Foo(const Foo& rhs) : str_(rhs.str_)
{
std::cout << "Copy Ctor" << std::endl;
}
void Foo:print() const
{
std::cout << "print [" << str_ << "]" << std:endl;
}
Foo getFoo()
{
return Foo(); // Expecting RVO
}
--- main.cpp ---
#include "foo.h"
int main()
{
Foo foo = getFoo();
foo.print();
}
foo.cpp と main.cpp が異なる翻訳単位であることを確認してください。したがって、私の理解では、翻訳ユニット main.o (main.cpp) で利用可能な getFoo() の実装の詳細はないと言えます。
しかし、上記をコンパイルして実行すると、RVO がここで動作していることを示す "Copy Ctor" 文字列が表示されませんでした。
「getFoo()」の実装の詳細が翻訳単位 main.o に公開されていなくても、これをどのように達成できるか教えていただければ幸いです。
GCC (g++) 4.4.6 を使用して上記の実験を行いました。