如何制作constexpr交换功能?

时间:2017-09-22 20:27:21

标签: c++ swap constexpr string-view

我正在制作我自己的String View课程用于学习目的,并且我试图让它成为100%constexpr。

为了测试它,我有一个返回哈希值的成员函数。然后我在一个switch语句中构造我的字符串视图,并调用相同的成员函数,如果它通过,那个成员函数已经完成了它的目的。

要了解,我使用/阅读/比较我的实施与Visual Studio 2017最新更新std::string_view,但是,我注意到,尽管swap被标记为{ {1}},它不起作用,也不起作用,也不起作用于g ++。

这段代码不起作用:

constexpr

这是if:的Visual Studio实现:

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;
        }

所有构造函数和赋值都标记为constexpr。

Visual Studio和g ++都给我类似的错误。

constexpr void swap(View & input) noexcept {
    View const data(input);
    input = *this;
    *this = data;
}

如果交换不能与constexpr一起使用,为什么要使用constexpr?

1 个答案:

答案 0 :(得分: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;
}

Demo