#include <iostream>
#define PRINT_OUT(msg) \
do { \
using std::cout; \
using std::endl; \
cout << msg << endl; \
} while(false)
struct nrvo {
nrvo(int id) : id(id) {
PRINT_OUT("nrvo: " << id);
}
nrvo(nrvo const& other) : id(other.id) {
PRINT_OUT("nrvo(nrvo const&): " << id);
}
~nrvo() {
PRINT_OUT("~nrvo: " << id);
}
friend std::ostream& operator <<(std::ostream& out, nrvo const& value) {
return out << value.id;
}
void init(int n) {
PRINT_OUT("init(" << n << ")");
}
private:
int id;
nrvo& operator =(nrvo const&);
};
// Different use-cases
nrvo unnamed(int n) {
return n % 2 == 0 ?
nrvo(1) :
nrvo(2);
}
nrvo named(int n) {
nrvo ret(42);
if (n % 2 == 0)
ret.init(1);
else
ret.init(2);
return ret;
}
nrvo different_names(int n) {
if (n % 2 == 0) {
nrvo a(42);
a.init(1);
return a;
}
else {
nrvo b(23);
b.init(2);
return b;
}
}
int main() {
int n;
std::cout << "Enter an integer: " << std::flush;
std::cin >> n;
{
PRINT_OUT(endl << "unnamed");
nrvo a = unnamed(n);
PRINT_OUT(a);
}
{
PRINT_OUT(endl << "named");
nrvo a = named(n);
PRINT_OUT(a);
}
{
PRINT_OUT(endl << "different_names (copy)");
nrvo a = different_names(n);
PRINT_OUT(a);
}
{
PRINT_OUT(endl << "different_names (ref)");
nrvo const& a = different_names(n);
PRINT_OUT(a);
}
}