 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Marcel Müller Guest
|
Posted: Fri Mar 02, 2007 3:11 pm Post subject: operator= bei boost::noncopyable |
|
|
Hallo,
ich habe mal eine Frage aus Neugier zu boost::noncopyable.
Warum ist der operator=(const noncopyable&) mit dem Returntyp const
noncopyable& definiert?
Zum einen hätte ich eher (wie üblich) noncopyable& als Returntyp eines
Zuweisungsoperators erwartet, zum anderen ist der Returntyp doch
eingentlich völlig egal, da C++ ohnehin keine Rückwärtsauflösung
überladener Funktionen über den Returntyp macht und der Operator ja nie
aufgerufen werden kann. Also hätte doch
void operator=( const noncopyable& );
auch genügt, oder?
Marcel |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Fri Mar 02, 2007 10:15 pm Post subject: Re: operator= bei boost::noncopyable |
|
|
Marcel Müller wrote:
| Quote: | Hallo,
ich habe mal eine Frage aus Neugier zu boost::noncopyable.
Warum ist der operator=(const noncopyable&) mit dem Returntyp const
noncopyable& definiert?
|
Warum nicht?
| Quote: | Zum einen hätte ich eher (wie üblich) noncopyable& als Returntyp eines
Zuweisungsoperators erwartet,
|
Wieso soll das üblich sein? Damit man auch sowas schreiben kann wie:
(a = b)++;
?
| Quote: | zum anderen ist der Returntyp doch eingentlich völlig egal, da C++ ohnehin
keine Rückwärtsauflösung überladener Funktionen über den Returntyp macht
und der Operator ja nie aufgerufen werden kann. Also hätte doch
void operator=( const noncopyable& );
auch genügt, oder?
|
Gegenfrage: Warum ist der Parameter const? |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sat Mar 03, 2007 6:17 pm Post subject: Re: operator= bei boost::noncopyable |
|
|
On Mar 2, 5:15 pm, Rolf Magnus <ramag...@t-online.de> wrote:
| Quote: | Marcel Müller wrote:
ich habe mal eine Frage aus Neugier zu boost::noncopyable.
Warum ist der operator=(const noncopyable&) mit dem Returntyp const
noncopyable& definiert?
Warum nicht?
|
Halt weil es nicht das Erwartete ist.
| Quote: | Zum einen hätte ich eher (wie üblich) noncopyable& als Returntyp eines
Zuweisungsoperators erwartet,
Wieso soll das üblich sein? Damit man auch sowas schreiben kann wie:
(a = b)++;
?
|
Immerhin (und ich bin eigentlich eher deine Meinung, dass der
Returntyp eine const Referenz sein soll): der Compiler
generierte default-Operator hat einen Returntyp T&. Damit ist
das die Erwartung.
Die Rationale dafür ist, etwas wie:
T&
f()
{
return a = b ;
}
zu erlauben.
| Quote: | zum anderen ist der Returntyp doch eingentlich völlig egal, da C++ ohnehin
keine Rückwärtsauflösung überladener Funktionen über den Returntyp macht
und der Operator ja nie aufgerufen werden kann. Also hätte doch
void operator=( const noncopyable& );
auch genügt, oder?
Gegenfrage: Warum ist der Parameter const?
|
Weil das auch der Default beim Compiler generierten Operator
ist:-). (Auch, freilich, damit man einen Temporär zuweisen
kann.)
--
James Kanze (Gabi Software) email: james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Sun Mar 04, 2007 2:05 am Post subject: Re: operator= bei boost::noncopyable |
|
|
James Kanze wrote:
| Quote: | On Mar 2, 5:15 pm, Rolf Magnus <ramag...@t-online.de> wrote:
Marcel Müller wrote:
ich habe mal eine Frage aus Neugier zu boost::noncopyable.
Warum ist der operator=(const noncopyable&) mit dem Returntyp const
noncopyable& definiert?
Warum nicht?
Halt weil es nicht das Erwartete ist.
Zum einen hätte ich eher (wie üblich) noncopyable& als Returntyp eines
Zuweisungsoperators erwartet,
Wieso soll das üblich sein? Damit man auch sowas schreiben kann wie:
(a = b)++;
?
Immerhin (und ich bin eigentlich eher deine Meinung, dass der
Returntyp eine const Referenz sein soll): der Compiler
generierte default-Operator hat einen Returntyp T&. Damit ist
das die Erwartung.
Die Rationale dafür ist, etwas wie:
T&
f()
{
return a = b ;
}
zu erlauben.
zum anderen ist der Returntyp doch eingentlich völlig egal, da C++
ohnehin keine Rückwärtsauflösung überladener Funktionen über den
Returntyp macht und der Operator ja nie aufgerufen werden kann. Also
hätte doch
void operator=( const noncopyable& );
auch genügt, oder?
Gegenfrage: Warum ist der Parameter const?
Weil das auch der Default beim Compiler generierten Operator
ist:-). (Auch, freilich, damit man einen Temporär zuweisen
kann.)
|
Warum er das im Normalfall ist, weiß ich schon. Hier geht es aber um eine
Deklaration für einen Zuweisungsoperator, die nur dazu da ist, daß man ihn
nicht aufrufen kann. Wenn man den Rückgabetyp dann von "const noncopyable&"
zu "void" ändert, weil's kürzer ist, kann man auch den Parameter verkürzen.
Tatsächlich schreibe ich dann eher sowas wie:
void operator=(noncopyable); |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Mon Mar 05, 2007 7:32 pm Post subject: Re: operator= bei boost::noncopyable |
|
|
On Mar 3, 9:05 pm, Rolf Magnus <ramag...@t-online.de> wrote:
| Quote: | James Kanze wrote:
|
[...]
| Quote: | Warum er das im Normalfall ist, weiß ich schon. Hier geht es aber um eine
Deklaration für einen Zuweisungsoperator, die nur dazu da ist, daß man ihn
nicht aufrufen kann. Wenn man den Rückgabetyp dann von "const noncopyable&"
zu "void" ändert, weil's kürzer ist, kann man auch den Parameter verkürzen.
Tatsächlich schreibe ich dann eher sowas wie:
void operator=(noncopyable);
|
Vorsicht. Der Parameter muss eine Referenz sein; amsonsten hast
du keinen Copy-Zuweisungsoperator, und der Compiler einen
generiert. Amsonsten geht es halt auf Lesbarkeit und was der
Leser erwartet. Ich gebe immer solche Copy-Constructore genau
die Signature, dass sie amsonst vom Compiler bekommen würde,
damit der Leser sofort erkennt, dass es um diesen Constructor
geht. Aber sehr bedeutend ist es nicht, und wenn du:
void operator=( noncopyable& ) ;
auch schreibst, denke ich, dass die meisten Leser es auch sofort
erkennen würden.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Mon Mar 05, 2007 9:42 pm Post subject: Re: operator= bei boost::noncopyable |
|
|
James Kanze wrote:
| Quote: | On Mar 3, 9:05 pm, Rolf Magnus <ramag...@t-online.de> wrote:
James Kanze wrote:
[...]
Warum er das im Normalfall ist, weiß ich schon. Hier geht es aber um eine
Deklaration für einen Zuweisungsoperator, die nur dazu da ist, daß man
ihn nicht aufrufen kann. Wenn man den Rückgabetyp dann von "const
noncopyable&" zu "void" ändert, weil's kürzer ist, kann man auch den
Parameter verkürzen. Tatsächlich schreibe ich dann eher sowas wie:
void operator=(noncopyable);
Vorsicht. Der Parameter muss eine Referenz sein; amsonsten hast
du keinen Copy-Zuweisungsoperator, und der Compiler einen
generiert.
|
Laut C++-Norm:
9 A user-declared copy assignment operator X::operator= is a non-static
non-template member function of class X with exactly one parameter of type
X, X&, const X&, volatile X& or const volatile X&.
[...]
10 If the class definition does not explicitly declare a copy assignment
operator, one is declared implicitly.
| Quote: | Amsonsten geht es halt auf Lesbarkeit und was der Leser erwartet.
|
Bei mir sieht's dann eben so aus:
class Foo
{
// ... irgendwas
private:
// prevent copying
Foo(Foo&);
void operator=(Foo);
};
Das halte ich schon durch den Kommentar für hinreichend lesbar. Ist
zugegeben etwas schreibfaul, aber ich hatte bisher keine Probleme damit. |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Tue Mar 06, 2007 4:51 pm Post subject: Re: operator= bei boost::noncopyable |
|
|
Rolf Magnus wrote:
| Quote: | James Kanze wrote:
On Mar 3, 9:05 pm, Rolf Magnus <ramag...@t-online.de> wrote:
James Kanze wrote:
[...]
Warum er das im Normalfall ist, weiß ich schon. Hier geht es aber um eine
Deklaration für einen Zuweisungsoperator, die nur dazu da ist, daß man
ihn nicht aufrufen kann. Wenn man den Rückgabetyp dann von "const
noncopyable&" zu "void" ändert, weil's kürzer ist, kann man auch den
Parameter verkürzen. Tatsächlich schreibe ich dann eher sowas wie:
void operator=(noncopyable);
Vorsicht. Der Parameter muss eine Referenz sein; amsonsten hast
du keinen Copy-Zuweisungsoperator, und der Compiler einen
generiert.
Laut C++-Norm:
9 A user-declared copy assignment operator X::operator= is a non-static
non-template member function of class X with exactly one parameter of type
X, X&, const X&, volatile X& or const volatile X&.
[...]
|
Tatsächlich. Ich dachte an Copy-Constructor.
[...]
| Quote: | Amsonsten geht es halt auf Lesbarkeit und was der Leser erwartet.
Bei mir sieht's dann eben so aus:
class Foo
{
// ... irgendwas
private:
// prevent copying
Foo(Foo&);
void operator=(Foo);
};
Das halte ich schon durch den Kommentar für hinreichend lesbar.
|
Freilich. Zuerst, wie gesagt, ist der Unterschied sowieso
klein. Aber ich halte das standard Idiom, mit den Signaturen
der default-Versionen, für ausreichend verbreitet, dass man
es erkennen können soll, auch ohne Kommentar.
Jetzt dass Boost verbreitet wird, halte ich den Idiom, wo
man von einem Uncopiable oder sowas erbt, auch für
ausreichend verbreitet, dass es ohne weitere Kommentar
benutzbar ist. (Ich habe Anfang der 1990igen Jahre damit
angefangen, dann aber es eingestellt, weil es nicht die
gewöhnliche Methode war, und jetzt benutze ich es wieder.)
| Quote: | Ist zugegeben etwas schreibfaul, aber ich hatte bisher
keine Probleme damit.
|
Sicher. Hoffentlich auch ohne Kommentar würde die meisten
Programmiere den Idiom erkennen. Nur bin ich gegen
Schreibfaulheit:-).
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|