使用constexpr进行constexpr文字初始化 [英] constexpr literal initialization with a constexpr
本文介绍了使用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屋!
查看全文