]>
Commit | Line | Data |
---|---|---|
b32b8144 | 1 | // Copyright Louis Dionne 2013-2017 |
7c673cae FG |
2 | // Distributed under the Boost Software License, Version 1.0. |
3 | // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) | |
4 | ||
5 | #include <boost/hana/bool.hpp> | |
6 | #include <boost/hana/integral_constant.hpp> | |
7 | namespace hana = boost::hana; | |
8 | ||
9 | ||
10 | /* | |
11 | When we use `int_<...>` in a template, Clang 3.5 says: | |
12 | ||
13 | -------------------------------- | |
14 | include/boost/hana/integral_constant.hpp:80:20: error: constexpr variable 'int_<1>' must be initialized by a constant expression | |
15 | constexpr auto int_ = integral<int, i>; | |
16 | ^ ~~~~~~~~~~~~~~~~ | |
17 | test/integral/constexpr_bug.cpp:41:37: note: in instantiation of variable template specialization 'boost::hana::int_' requested here | |
18 | constexpr auto check_int() { return int_<1>; } | |
19 | ^ | |
20 | include/boost/hana/integral_constant.hpp:80:27: note: subexpression not valid in a constant expression | |
21 | constexpr auto int_ = integral<int, i>; | |
22 | ^ | |
23 | include/boost/hana/integral_constant.hpp:80:27: note: in call to 'integral_type(integral)' | |
24 | -------------------------------- | |
25 | ||
26 | if we define int_ & friends like | |
27 | ||
28 | template <int i> | |
29 | constexpr auto int_ = integral<int, i>; | |
30 | ||
31 | Instead, we do | |
32 | ||
33 | template <int i> | |
34 | constexpr decltype(integral<int, i>) int_{}; | |
35 | ||
36 | which is equivalent but uglier. Note that everything works just fine when | |
37 | we're not in a template. | |
38 | */ | |
39 | ||
40 | template <typename T> | |
41 | constexpr auto check_int() { return hana::int_c<1>; } | |
42 | ||
43 | template <typename T> | |
44 | constexpr auto check_true() { return hana::true_c; } | |
45 | ||
46 | template <typename T> | |
47 | constexpr auto check_size_t() { return hana::size_c<0>; } | |
48 | ||
49 | ||
50 | int main() { } |