#include <iostream>
struct A
{
A( ) { std::cout << "A::A\n"; }
A( const A& ) { std::cout << "A::A(A&)\n"; }
~A( ) { std::cout << "A::~A\n"; }
A& operator=(const A&) { std::cout << "A::operator=\n"; }
};
A foo()
{
return A();
}
A bar()
{
A result;
return result;
}
int main( )
{
std::cout << "1\n";
A a = foo();
std::cout << "2\n";
a = foo();
std::cout << "3\n";
A b = bar();
return 0;
}
% g++ --version
g++ (GCC) 4.0.4 20060507 (prerelease) (Debian 4.0.3-3)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
% g++ test.cpp
% ./a.out
1
A::A
2
A::A
A::operator=
A::~A
3
A::A
A::~A
A::~A
Как видно, конструктор копирования не был вызван ни разу, в коде не применялось никаких ухищрений, вроде возврата ссылки.
Т.е. обычный стандартный код выполняется без каких либо потерь на копирование временных объектов.
#include <iostream>
struct A
{
A ()
{
std::cerr << "Объект создан!" << std::endl;
}
};
A
getA ()
{
A a;
return a;
}
int
main ()
{
A a;
a = getA ();
}
Он выводит фразу 2 раза.
Хотя по моей версии должен выдать 3 раза.
Если сделать getA inline - ничего не меняется.
Вывалил прогу в asm-код (опция -S у g++) - посмотрю на досуге.
Ну смотреть в MSDN для выяснения "фишек" С++ это конечно круто =)
Как эта муть называется, и почему она есть, можно прочитать в моём последнем посте на 1-й странице. Думаю, стандарт C++ правильнее читать, чем MSDN =)
Ну смотреть в MSDN для выяснения "фишек" С++ это конечно круто =)
Как эта муть называется, и почему она есть, можно прочитать в моём последнем посте на 1-й странице. Думаю, стандарт C++ правильнее читать, чем MSDN =)
если я не ошибаюсь, этого в стандарте еще нет. только в будущем