[ create a new paste ] login | about

Link: http://codepad.org/dwtvFWaE    [ raw code | output | fork | 1 comment ]

C++, pasted on Jan 14:
#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);
    }
}


Output:
Enter an integer: 
unnamed
nrvo: 1
nrvo(nrvo const&): 1
~nrvo: 1
nrvo(nrvo const&): 1
~nrvo: 1
1
~nrvo: 1

named
nrvo: 42
init(1)
nrvo(nrvo const&): 42
~nrvo: 42
nrvo(nrvo const&): 42
~nrvo: 42
42
~nrvo: 42

different_names (copy)
nrvo: 42
init(1)
nrvo(nrvo const&): 42
~nrvo: 42
nrvo(nrvo const&): 42
~nrvo: 42
42
~nrvo: 42

different_names (ref)
nrvo: 42
init(1)
nrvo(nrvo const&): 42
~nrvo: 42
42
~nrvo: 42


Create a new paste based on this one


Comments:
posted by konrad on Jan 14
reply