Почему string_view, передаваемый в функцию constexpr, компилируется, когда передается как тип шаблона?
Этот код не компилируется. Я предполагаю, что это потому, что string_view не является LiteralType, который нарушает условия функции constexpr ( http://en.cppreference.com/w/cpp/language/constexpr):
constexpr std::size_t find_space(std::string_view sv) noexcept {
return sv.find(' ');
}
int main() {
const std::string_view sv("Finding first space");
return find_space(sv);
}
Тем не менее... если я заменю значение шаблона, он прекрасно скомпилируется. Почему компилятор позволяет это?
template <typename STRING_VIEW>
constexpr std::size_t find_space(STRING_VIEW sv) noexcept {
return sv.find(' ');
}
Это как если бы компилятор игнорировал constexpr, или каким-то образом признаки STRING_VIEW позволили ему пройти.
Использование GCC 7.1 с -O3 -std= C++1z. Код песочницы на https://godbolt.org/g/z89Myb
Большое спасибо, Алекс