使用constexpr进行constexpr文字初始化 [英] constexpr literal initialization with a constexpr

查看:42
本文介绍了使用constexpr进行constexpr文字初始化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一个简单的例子:

 static constexpr const char literal1[] = "abcde"; 
 static constexpr const char literal2[] = literal1;

编译错误.如何使其工作以及为什么不起作用?

compilation error. How to make it work and why it doesn't?

推荐答案

更新:

为回应评论,这是修订后的版本.

In response to comment, here's a revised verson.

immutable :: string 建模一个类似于constexpr的类似字符串的对象,该对象跟踪原始字符串文字.它与c ++ 17的 string_view 非常相似,不同之处在于模板构造函数避免了随时调用 strlen 的需求.

The class immutable::string models a constexpr string-like object which tracks the original string literal. It's very similar to c++17's string_view except that the template constructor avoids the need for a call to strlen at any time.

#include <cstdint>
#include <array>
#include <utility>
#include <iostream>

namespace immutable {

    struct string
    {
        template<std::size_t N>
        constexpr string(const char (&s)[N])
        : _data(s)
        , _size(N-1)
        {}

        constexpr const char* data() const { return _data; }
        constexpr std::size_t size() const { return _size; }

        const char* const _data;
        const std::size_t _size;
    };
    std::ostream& operator<<(std::ostream& os, string s)
    {
        return os.write(s.data(), s.size());
    }
}


static constexpr auto literal1 = immutable::string("abcde");
static constexpr auto literal2 = literal1;

int main()
{
    std::cout << literal1 << std::endl;
    std::cout << literal2 << std::endl;
}

这篇关于使用constexpr进行constexpr文字初始化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆