コンストラクターが2回呼ばれるのはもったいない

上述した関数 foo のようにしてインスタンスを返すと、foo 内で一度コンストラクターが呼ばれ、それを return で戻り値として返すときにもコンストラクター(コピーコンストラクター)が呼ばれ、計2回呼ばれていることになる。無駄というかもったいない。1回だけにできないのか?
ためしにつぎのようにしてみた。

#include 
using namespace std;

class A {
public:
    A() {
        cout << "A::A()" << endl;
    }
    A(const A& a) {
        cout << "A::A(const A&)" << endl;
    }
    virtual ~A() {
        cout << "A::~A()" << endl;
    }
};

A foo() {
    cout << "b" << endl;
    return A();
}

void main() {
    cout << "a" << endl;
    A a = foo();
    cout << "c" << endl;
}

こうすると実行結果は、

a
b
A::A()
c
A::~A()

となり、一応節約できていることにはなる。しかし、return の1行内でできることには制限がありすぎる。
たしかにスタックの深さが、foo とそれを呼ぶ main とでは違っているので、foo の(return 以外の)中で作ったインスタンスを、その呼び出し元の main のスタックに渡そうとすると、どうしてもコピーしないといけないのは分かるような気がする。でも無駄だ。そもそもインスタンスの実体をヒープではなくスタックに置く、という概念が Java に慣れた身から見ると、奇異に感じる。