Hoi,
Ik ben iets raars tegengekomen met GCC. Als ik de volgende code compileer:
.. dan geeft GCC als resultaat:
Als ik regel 19 wijzig in:
.. dan geeft GCC:
Als ik vervolgens van regel 19 het volgende maak:
.. dan pakt gcc 'em wel. En als ik dat weer terug zet en op regel 12 de functie-declaratie van foo() aanpas:
.. dan pakt GCC wonder boven wonder beide bovenstaande pogingen met temporaries.
Ik heb dit met zowel GCC 2.95.3 (OpenBSD 3.2 native) als GCC 3.2 (uit de OpenBSD 3.2 ports tree) geprobeerd, beiden weigeren.
Visual C++ .NET (7.0) lijkt het wel goed te doen; dat compileerd in ieder geval, en de bovenstaande test draait ook goed.
Kan iemand mij misschien het waarom hierachter uitleggen, want ik begrijp er geen hout van.. een variabele is toch een variabele? En dat een temporary niet bij by-reference zou kunnen werken kan ik me iets bij voorstellen, maar waarom werkt het dan wel bij een const reference?
Bij voorbaat dank,
Tabsels.
Ik ben iets raars tegengekomen met GCC. Als ik de volgende code compileer:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #include <iostream> using namespace std; class bar { public: bar() { a = 5; } bar(int b) { a = b;} ~bar() {} int a; }; void foo(bar &b) { cout << b.a <<endl; } int main(int argc, char* argv[]) { foo(bar(4)); return 0; } |
.. dan geeft GCC als resultaat:
code:
1
2
3
4
5
| [wouter@ttyp3] fear:~$ g++ blah.cc -o blah blah.cc: In function `int main(int, char **)': blah.cc:19: initialization of non-const reference type `class bar &' blah.cc:19: from rvalue of type `bar' blah.cc:13: in passing argument 1 of `foo(bar &)' |
Als ik regel 19 wijzig in:
C++:
19
| foo(bar b(4)); |
.. dan geeft GCC:
code:
1
2
3
| [wouter@ttyp3] fear:~$ g++ blah.cc -o blah
blah.cc: In function `int main(int, char **)':
blah.cc:19: syntax error before `(' |
Als ik vervolgens van regel 19 het volgende maak:
C++:
17
18
19
20
| int main(int argc, char* argv[]) { bar b(4); foo(b); |
.. dan pakt gcc 'em wel. En als ik dat weer terug zet en op regel 12 de functie-declaratie van foo() aanpas:
C++:
12
| void foo(const bar &b) |
.. dan pakt GCC wonder boven wonder beide bovenstaande pogingen met temporaries.
Ik heb dit met zowel GCC 2.95.3 (OpenBSD 3.2 native) als GCC 3.2 (uit de OpenBSD 3.2 ports tree) geprobeerd, beiden weigeren.
Visual C++ .NET (7.0) lijkt het wel goed te doen; dat compileerd in ieder geval, en de bovenstaande test draait ook goed.
Kan iemand mij misschien het waarom hierachter uitleggen, want ik begrijp er geen hout van.. een variabele is toch een variabele? En dat een temporary niet bij by-reference zou kunnen werken kan ik me iets bij voorstellen, maar waarom werkt het dan wel bij een const reference?
Bij voorbaat dank,
Tabsels.
[ Voor 9% gewijzigd door Verwijderd op 01-01-2003 23:53 ]