Страйструп стр 302 утверждается что «Временная переменная уничтожается, когда „её! ссылка или именованный объект выходят из области видимости“ и что „Временная переменная может использоваться в качестве инициализатора константной ссылки или именованного объекта“. Если оба утверждения верны то:
1) следующее должно работать:
#include <iostream>
void f1(int i) { std::cout << "hello " << i << std::endl;}
class C1
{
int i;
void (*F)(int);
public:
C1() {i =1; F=f1; std::cout << "C1 init constructor" << std::endl;}
C1(int I) {i = I; F=f1; std::cout << "C1 int constructor" <<std::endl;}
C1(const C1& c) {i = c.i; F=f1; std::cout << "C1 copy construcror" << std::endl;}
C1& operator=(const C1& c ) {i = c.i; std::cout <<"C1 operator =" << std::endl; return *this;}
~C1() {F=0; std::cout << "C1 destructor " << i << std::endl; }
C1 operator+(const C1& c) {; std::cout << "C1 operator+" <<std::endl; return C1(i + c.i);}
C1& operator+(int ii) {i += ii; return *this;}
void f() const {F(i);}
};
int main()
{
C1 c1;
C1 c2;
const C1& c3 = (c1 + c2) + 1;
C1 c4;
c1.f();
c2.f();
c3.f();
c4.f();
}
что не правда:
$g++ -std=c++98 -pedantic -Wall -Wextra c++test13.cc
$./a.out
C1 init constructor
C1 init constructor
C1 operator+
C1 int constructor
C1 destructor 3
C1 init constructor
hello 1
hello 1
Ошибка сегментации(core dumped)
Какого лешего деструктор вызывается так рано?
2) В следующем деструкторы должны вызываться в конце:
-"-
int main()
{
C1 c1;
C1 c2;
C1 c3 = (c1 + c2) + 1;
C1 c4;
c1.f();
c2.f();
c3.f();
c4.f();
}
что опять не правда:
$g++ -std=c++98 -pedantic -Wall -Wextra c++test13.cc
$./a.out
C1 init constructor
C1 init constructor
C1 operator+
C1 int constructor
C1 copy construcror
C1 destructor 3
C1 init constructor
hello 1
hello 1
hello 3
hello 1
C1 destructor 1
C1 destructor 3
C1 destructor 1
C1 destructor 1
Тут наверное текст перевели с ошибками либо в сам автор описался, так как ранее он урверждает что временная переменная существует до окнца полного выражения где она родилась, что тут собственно и происходит.
ЗЫ: А вот прикола с константной ссылкой я непонял. Может кто объяснит?