"Bjarke Dahl Ebert" <bebert@worldonline.dk> wrote in message
news:8u4l9.36466$Qk5.1633012@news010.worldonline.dk...
[8<8<8<]
> Spørgsmål til gruppen: Er det egentlig lovligt at skrive:
> MinKlasse foo = (MinKlasse(32) = 42);
Det kommer an på hvilken type "MinKlasse:
erator=" returnerer.
Følgende
<code>
class foo
{
public:
explicit foo(unsigned numbits, int value = 0) :
numbits_(numbits),
value_(value) {}
foo& operator= (int value)
{
value_ = value;
return *this;
}
private:
unsigned numbits_;
int value_;
};
int main()
{
foo f1 = foo(56) = 78;
foo f2(56, 78);
}
</code>
ser ud til at være lovligt, og gør det som Thomas de Silva oprindeligt
spurgte om.
Dog med en lidt anden syntax;
Såvel "f1" og "f2" har "numbit_ == 56" og "value == 78", efter de er
constructed.
Hvis "foo:
erator=" havde returneret "void" var det ikke lovligt - men det
er heller ikke en normal situation.
I bedste fald syntes jeg måden at initialisere "f1" er overranskende.
Bemærk iøvrigt at i C++ Starndard library findes klassen "std::bitset", hvor
antallet af bits er et template argument og værdien kan som en "unsigned
long" (i den udstrækning "unsigned long" har tilstrækkeligt mange bits) til
constructoren .
> Det hænger vel på om man må kalde en non-const metode (nemlig operator=)
på
> et temporært objekt. Så vidt jeg husker må man godt kalde non-const
metoder
> på temp-objekter, men man må ikke give temp-objekter som non-const
> reference-parametre til funktioner - husker jeg rigtigt?
Det er ikke helt præcist.
Spørgsmålet er ikke om objektet er temporært eller ej, men om konverteringen
er implicit.
Der bliver ikke foretaget implicit convertion for at kalde funktioner, der
tager et non-const reference argument.
Temporære objekter kan gives til en funktion, der tager en non-const
reference, såfremt det temporære objekt ikke er fremkommet ved en implicit
konvertering.
Se eventuelt
The C++ Programming Language, Special Edition
Bjarne Stroustrup
ISBN 0-201-70073-5
side 281.
eller C++ Standarden §13.3.2-3
<code>
class foo
{
public:
foo(unsigned numbits, int value = 0) :
numbits_(numbits),
value_(value) {}
foo& operator= (int value)
{
value_ = value;
return *this;
}
private:
unsigned numbits_;
int value_;
};
void bar1(foo& f);
void bar2(const foo& f);
void bar3(foo f);
int main()
{
bar1(1); // error
bar2(1); // ok
bar3(1); // ok
bar1(foo(1)); // ok
bar2(foo(1)); // ok
bar3(foo(1)); // ok
}
</code>
Venlig hilsen
Mogens Hansen