1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include <iostream>
template <typename T>
struct RO_proxy
{
operator const T() const { return v_; }
RO_proxy(T const& v) : v_(v) {}
private:
T const & v_;
};
struct toto
{
toto() : entier_(0), entier(entier_) {}
void next() { ++entier_; }
private:
int entier_;
public:
RO_proxy<int> entier;
};
int main (int argc, char **argv)
{
toto t;
std::cout << t.entier << std::endl;
t.next();
std::cout << t.entier << std::endl;
// t.entier = 2;
// est interdit car on ne peut copier des RO_proxy entre eux...
// 2 est implicitement converti en RO_proxy, mais ces derniers
// ne sont pas assignables => refusé
int i = 41;
RO_proxy<int> p = i;
++i;
std::cout << p << std::endl;
// p = 12;
i = t.entier;
std::cout << p << std::endl;
// p = t.entier;
// est interdit car on utilise une référence => non assignable
RO_proxy<int> q = t.entier;
t.next();
std::cout << q << std::endl;
// Aussi inutile que cela puisse être, ceci est accepté
// J'ai quand même un doute quant à sa validité.
RO_proxy<int> r = 2;
std::cout << r << std::endl;
std::cout << std::endl;
return 0;
}
// Vim: let $CXXFLAGS='-Wall -pedantic' |
Partager