如何制作 constexpr 交换函数?
How do I make a constexpr swap function?
出于学习目的,我正在制作自己的字符串视图 class,并且我正在努力使其 100% constexpr。
为了测试它,我有一个 returns 哈希值的成员函数。然后我在 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 if:
的实现
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;
}
这是我 class 的,它与 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]
如果 swap 不能与 constexpr 一起使用,为什么要使用 constexpr?
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;
}
出于学习目的,我正在制作自己的字符串视图 class,并且我正在努力使其 100% constexpr。
为了测试它,我有一个 returns 哈希值的成员函数。然后我在 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 if:
的实现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;
}
这是我 class 的,它与 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]
如果 swap 不能与 constexpr 一起使用,为什么要使用 constexpr?
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;
}