寫一個簡單的編譯時間std::array
工廠從一個生成器函數,我偶然發現:鏗鏘++ 3.5.1和g ++ 4.9.2不同意函數是否是constexpr
或不。gcc和clang不同意constexpr函數
的代碼(這是C++ 14!):
#include <array>
#include <utility>
template <class T, std::size_t N, class GenType, std::size_t... I>
constexpr std::array<T, N>
make_array_impl (GenType gen, std::index_sequence <I...>)
{
return {{ gen (I)... }};
}
template <class T, std::size_t N, class GenType>
constexpr std::array<T, N>
make_array (GenType gen)
{
return make_array_impl <T, N> (
gen,
std::make_index_sequence <N> {}
);
}
constexpr int
generator_const (std::size_t /* index */)
{
return 1;
}
constexpr auto
a = make_array <int, 3> (generator_const);
static_assert (a.size() == 3, "");
static_assert (a[0] == 1, "");
static_assert (a[1] == 1, "");
static_assert (a[2] == 1, "");
int main() {}
與克++編譯:
migou ~ % g++ -std=c++14 ex.cpp
ex.cpp:28:41: in constexpr expansion of ‘make_array<int, 3ul, int (*)(long unsigned int)>(generator_const)’
ex.cpp:18:5: in constexpr expansion of ‘make_array_impl<int, 3ul, int (*)(long unsigned int), {0ul, 1ul, 2ul}>(gen, (std::make_index_sequence<3ul>{}, std::make_index_sequence<3ul>()))’
ex.cpp:8:21: error: expression ‘generator_const’ does not designate a constexpr function
return {{ gen (I)... }};
隨着鐺++它編譯就好了。我可以繼續考慮這個有效的g ++ 14(因此g ++ bug)嗎?
'g ++'在['g ++'version __5__](https://gcc.gnu.org/projects/cxx1y.html)放寬了'constexpr'的要求,所以也許就是這個原因。 'clang'已經在3.4版本中實現了N3638。 – Zeta 2015-02-10 16:11:21