|
Boost : |
Subject: [boost] Boost.Exception and constexpr
From: Marshall Clow (mclow.lists_at_[hidden])
Date: 2013-01-09 21:23:39
I was playing around with Boost.Array tonight, seeing if I could make the signatures more closely match std::array.
Specifically, I wanted to add 'constexpr' to "operator [] (size_t) const" and "at (size_t) const"as proposed in
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3470.html
But I ran into a problem.
Here are the implementations:
const_reference operator[](size_type i) const
{
BOOST_ASSERT_MSG( i < N, "out of range" );
return elems[i];
}
const_reference at(size_type i) const { rangecheck(i); return elems[i]; }
static void rangecheck (size_type i) {
if (i >= size()) {
std::out_of_range e("array<>: index out of range");
boost::throw_exception(e);
}
}
BOOST_ASSERT does not fit into the constexpr world at all, and neither does rangecheck.
I could rewrite rangecheck so it could be constexpr, but only (I believe) by throwing the exception directly, rather than using boost::throw_exception.
static void rangecheck (size_type i) {
if (i >= size())
throw std::out_of_range e("array<>: index out of range");
}
or even just:
BOOST_CONSTEXPR const_reference at(size_type i) const {
return i >= size () ? throw std::out_of_range e("array<>: index out of range") : elems[i];
}
Has anyone put any effort into making Boost.Exception (and BOOST_ASSERT) work with constexpr?
-- Marshall
Marshall Clow Idio Software <mailto:mclow.lists_at_[hidden]>
A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly moderated down to (-1, Flamebait).
-- Yu Suzuki
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk