Boost logo

Boost :

From: Marco Manfredini (marco_at_[hidden])
Date: 2000-07-17 11:07:39

> -----Ursprungliche Nachricht-----
> Von: Beman Dawes [mailto:beman_at_[hidden]]
> Gesendet: Sonntag, 16. Juli 2000 16:35
> An: mailing list
> Betreff: [boost] Exception specifications in smart_ptr.hpp
> In reviewing the log file from the regression test, I noticed
> the following
> from both Borland 5.4 and 5.5:
> Warning W8026 c:/boost/site/libs/smart_ptr/smart_ptr_test.cpp
> 61: Functions
> with exception specifications are not expanded inline in
> function main()
> smart_ptr.hpp has throw specifiers on a number of
> time-critical inline
> functions such as dereferencing:
> T& operator*() const throw() { return *ptr; }
> It's a disaster if these aren't inlined.

Just for curiosity

The following (for example)

template<class T>
struct ptr
        T* v;
        ptr(T* _v) : v(_v) {}
        T& operator*() const throw() { return *v; }

int main(int argc, char* argv[])
        ptr<char> nullp(NULL);
        char& pc=*nullp;
        char c=pc;
        return 0;

crashes, as expected, in the line "char c=pc" (MSVC6).

Is the throw() declaration meaningful, since some hidden paragraph in the
standard allows a compiler to throw if he detects the construction of a null
reference? I have only seen the obvious bag yet, saying the behaviour is
(And the same goes to the construction of references in that they shall
always bind a valid object or function (, which can't be guaranteed
with pointers, but that's another thing)

I haven't seen any instructions yet, that 'undefined' operations shall throw
exceptions. Couldn't there be an option to detect them? Like:

T& operator *() const throw()
        if (v==NULL) throw undefined_behaviour();
        return *v;

Marco Manfredini

Boost list run by bdawes at, gregod at, cpdaniel at, john at