Как мне сделать функцию обмена constexpr?
Я делаю свой собственный класс String View для целей обучения и пытаюсь сделать его на 100% constexpr.
Чтобы проверить это, у меня есть функция-член, которая возвращает хэш-значение. Затем я создаю свое строковое представление в операторе switch и вызываю ту же функцию-член, если она проходит, эта функция-член полностью выполнила свое назначение.
Чтобы узнать, я использую / читаю / сравниваю свою реализацию с последним обновлением Visual Studio 2017 std::string_view
Однако я заметил, что, несмотря на swap
быть отмеченным как constexpr
не работает, ни в Visual Studio, ни в g++.
Это кусок кода, который не работает:
constexpr Ali::String::View hello("hello");
constexpr Ali::String::View world("world");
// My implementation fails here!
hello.swap(world);
cout << hello << " " << world << endl;
// Visual Studio implementation fails here!
// std::string_view with char const * is not constexpr because of the length
constexpr std::string_view hello("hello");
constexpr std::string_view world("world");
hello.swap(world);
cout << hello << " " << world << endl;
И это реализация Visual Studio, если:
constexpr void swap(basic_string_view& _Other) _NOEXCEPT
{ // swap contents
const basic_string_view _Tmp{_Other}; // note: std::swap is not constexpr
_Other = *this;
*this = _Tmp;
}
Этот из моего класса, и он похож на тот из Visual Studio.
constexpr void swap(View & input) noexcept {
View const data(input);
input = *this;
*this = data;
}
Все конструкторы и присваивания помечены как constexpr.
И Visual Studio, и g ++ дают мне похожие ошибки.
// Visual Studio
error C2662: 'void Ali::String::View::swap(Ali::String::View &) noexcept': cannot convert 'this' pointer from 'const Ali::String::View' to 'Ali::String::View &'
// g++
error: passing 'const Ali::String::View' as 'this' argument discards qualifiers [-fpermissive]
Если своп не работает с constexpr, зачем использовать constexpr?
1 ответ
swap
отмечен constexpr
быть разрешенным быть вызванным в constexpr
функции, например:
constexpr int foo()
{
int a = 42;
int b = 51;
swap(a, b); // Here swap should be constexpr, else you have error similar to:
// error: call to non-constexpr function 'void swap(T&, T&) [with T = int]'
return b;
}