Как использовать std::string_view::remove_prefix() в constexpr string_view

std::string_view::remove_prefix() и std::string_view::remove_suffix() являются функциями-членами constexpr в С++ 17; однако они изменяют переменную, для которой они вызываются. Если значение равно constexpr, оно также будет const и не может быть изменено, так как же эти функции можно использовать со значением constexpr?

Другими словами:

constexpr std::string_view a = "asdf";
a.remove_prefix(2); // compile error- a is const

Как вы используете эти функции на constexpr std::string_view? Если их нельзя использовать на constexpr std::string_view, почему сами функции отмечены constexpr?


person leecbaker    schedule 26.06.2017    source источник


Ответы (1)


Причина, по которой они отмечены constexpr, заключается в том, что вы можете использовать их в функции constexpr, например:

constexpr std::string_view remove_prefix(std::string_view s) {
    s.remove_prefix(2);
    return s;
}

constexpr std::string_view b = remove_prefix("asdf"sv);

Если бы remove_prefix() не было constexpr, это было бы ошибкой.


При этом я бы написал:

constexpr std::string_view a = "asdf"sv.substr(2);
person Barry    schedule 26.06.2017
comment
Это имело бы смысл, но на самом деле функция constexpr void remove_prefix(size_type). Сможете ли вы когда-нибудь использовать метод, единственной целью которого является изменение существующего объекта в constexpr? - person Useless; 26.06.2017
comment
@Useless Код в моем ответе делает именно это. Я согласен, что это странно. - person Barry; 26.06.2017
comment
Так и есть! Я совершенно неправильно понял вашу бесплатную функцию. На самом деле это не работает для меня в GCC7.1, но я думаю, что это первые дни для 1z. - person Useless; 26.06.2017
comment
@Useless Да, я тоже это заметил - реализация remove_prefix() в libstdc++ не помечена constexpr. - person Barry; 26.06.2017
comment
constexpr подразумевает const, не так ли? Значит, std::string_view::remove_prefix() не может изменять себя? - person inetknght; 26.06.2017
comment
@inetknght Нет, это не так. Функция-член constexpr не обязательно должна быть функцией-членом const. - person Barry; 26.06.2017