Somebody in c.l.c++.m[1] dug out an overlooked clause in 12.2/5
[class.temporary], namely that "A temporary bound to a reference member in a
constructor's ctor-initializer (12.6.2) persists until the constructor exists"
The following piece of code should therefore print:
===
A()
A()
B()
~A()
~A()
main
===
however, all tested versions (gcc-3.3.6, gcc-4.0.3, gcc-4.1.0) print:
==
A()
~A()
A()
~A()
B()
main
==
// begin example
extern "C" int puts(const char*);
struct A
{
A() { puts("A()"); }
~A() { puts("~A()"); }
};
struct B
{
const A &a1;
const A &a2;
B() : a1(A()),a2(A()) { puts("B()"); }
};
int main()
{
B b;
puts("main");
}
// end example
References:
[1] Message-ID:<[EMAIL PROTECTED]>
--
Summary: violation of [class.temporary]/5
Product: gcc
Version: 4.0.3
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: marco at technoboredom dot net
GCC build triplet: i586-suse-linux
GCC host triplet: i586-suse-linux
GCC target triplet: i586-suse-linux
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26714