Почему 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

Большое спасибо, Алекс

0 ответов

Другие вопросы по тегам