首先请看下面的代码,它由 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 进行了上述实验。