|
Boost : |
Subject: Re: [boost] Boost.Exception and constexpr
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2013-01-10 14:31:30
Le 10/01/13 20:12, Andrey Semashev a écrit :
> On Thu, Jan 10, 2013 at 10:51 PM, Vicente J. Botet Escriba
> <vicente.botet_at_[hidden]> wrote:
>> Le 10/01/13 19:13, Andrey Semashev a écrit :
>>
>>> On Thu, Jan 10, 2013 at 9:06 PM, Vicente J. Botet Escriba
>>> <vicente.botet_at_[hidden]> wrote:
>>>> Have you tried declaring arr as a constexpr?
>>> It doesn't make any difference, the error is the same.
>>>
>> The constructor for array must be declared constexpr as well.
>> The following works with clang 3.1, 3.2 and gcc 4.7.1, 4.7.2. I have no
>> access to other C++11 compilers now. Could you try it?
> The error is still the same.
>
> ./constexpr_test.cpp: In function int main(int, char**):
> ./constexpr_test.cpp:20:21: in constexpr expansion of arr.array<T,
> n>::at<int, 5u>(10u)
> ./constexpr_test.cpp:7:36: error: expression <throw-expression> is
> not a constant-expression
> ./constexpr_test.cpp:20:23: note: in template argument for type int
> ./constexpr_test.cpp:20:26: error: invalid type in declaration before ; token
> ./constexpr_test.cpp:21:14: error: request for member get in a,
> which is of non-class type int
>
> The constructor doesn't make any difference, it's the at() method body
> that causes the error.
Yes it does. The error you get here is the one you must obtain when the
exception is throw during compile time.
> The disappointing part is that the error message itself does not point
> to the source of the problem and is misleading. The note before the
> error mentions the method arguments but (a) it will not necessarily be
> displayed by various IDEs and (b) it doesn't point out the problem
> (i.e. that 10 > 5). If only it was possible to overload at() based on
> constexpr qualification and use static_assert to display the
> message...
>
The error message is a QOI. Here it is the error with clang 3.1/3.2
clang-darwin.compile.c++
../../../bin.v2/libs/thread/test/test_so.test/clang-darwin-3.1xl/debug/threading-multi/test_so.o
../example/test_so.cpp:20:12: error: non-type template argument is not a
constant expression
check< arr.at(10) > a;
^~~~~~~~~~
../example/test_so.cpp:7:30: note: subexpression not valid in a constant
expression
return i < n ? T() : throw 0;
^
../example/test_so.cpp:20:12: note: in call to '10->at()'
check< arr.at(10) > a;
^
Best,
Vicente
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk