B
better_cs_now
Hello All,
Please consider the following:
#include <iostream>
using namespace std;
class Foo
{
public:
Foo()
{
cout << "Foo::Foo()" << endl;
}
~Foo()
{
cout << "Foo::~Foo()" << endl;
}
Foo(const Foo &)
{
cout << "Foo::Foo(const Foo &)" << endl;
}
};
void func3()
{
throw Foo();
}
void func2()
{
func3();
}
void func1()
{
func2();
}
int main()
{
try
{
func1();
}
catch(const Foo &)
{
cout << "Caught Foo" << endl;
}
}
This results in the following output:
Foo::Foo()
Caught Foo
Foo::~Foo()
This shows that the copy constructor does not run. Yet, if I make the
copy constructor private, the compiler balks with the following:
main.cpp: In function `void func3()':
main.cpp:20: error: `Foo::Foo(const Foo&)' is private
main.cpp:27: error: within this context
main.cpp:20: error: `Foo::Foo(const Foo&)' is private
main.cpp:27: error: within this context
This leads to two questions:
1. Why does the compiler balk about inaccessibility of a function (the
copy constructor) it does not use?
2. Why *is* it not using the copy constructor? I would have expected
to see the exception object copy constructed / destructed at each
level of the call stack as that stack is unwound.
Thanks,
Dave
Please consider the following:
#include <iostream>
using namespace std;
class Foo
{
public:
Foo()
{
cout << "Foo::Foo()" << endl;
}
~Foo()
{
cout << "Foo::~Foo()" << endl;
}
Foo(const Foo &)
{
cout << "Foo::Foo(const Foo &)" << endl;
}
};
void func3()
{
throw Foo();
}
void func2()
{
func3();
}
void func1()
{
func2();
}
int main()
{
try
{
func1();
}
catch(const Foo &)
{
cout << "Caught Foo" << endl;
}
}
This results in the following output:
Foo::Foo()
Caught Foo
Foo::~Foo()
This shows that the copy constructor does not run. Yet, if I make the
copy constructor private, the compiler balks with the following:
main.cpp: In function `void func3()':
main.cpp:20: error: `Foo::Foo(const Foo&)' is private
main.cpp:27: error: within this context
main.cpp:20: error: `Foo::Foo(const Foo&)' is private
main.cpp:27: error: within this context
This leads to two questions:
1. Why does the compiler balk about inaccessibility of a function (the
copy constructor) it does not use?
2. Why *is* it not using the copy constructor? I would have expected
to see the exception object copy constructed / destructed at each
level of the call stack as that stack is unwound.
Thanks,
Dave