如何在C ++中将用户定义的文字放入相同类型的constexpr类中?

时间:2018-08-24 17:37:45

标签: c++ c++17 syntactic-sugar user-defined-literals

我想实现自己的字符串文字类Literal和运算符:

constexpr Literal operator""_s(const char* str, size_t size);

class Literal {
  friend constexpr Literal operator"" _s(const char*, size_t);

  constexpr Literal(const char* str, size_t size);

  const char* str = nullptr;
  const size_t size = 0u;
};

然后我想在班级内放置一个空文字:

class Literal {
  …
  static constexpr const Literal empty = ""_s;
  …
};

按预期,编译器拒绝此类构造,因为此时类不完整。我还建议从技术上讲应该可行,因为编译器只需要将char* str = nullptr的一对size_t size = 0empty放在某个地方,并在编译时将其分配给static我班的实例。

是否有一些“技巧”来实现类似auto new_literal = Literal::empty;的子句?

2 个答案:

答案 0 :(得分:1)

  

是否有一些“技巧”来实现像auto new_literal = Literal::empty;这样的子句?

您可以添加静态成员函数,

class Literal {
  // …
  static constexpr Literal empty() { return ""_s; }
  // …
}

,并像

一样使用它
constexpr auto new_literal = Literal::empty();

但是请注意

static_assert("" != nullptr);
static_assert(""[0] == '\0');

答案 1 :(得分:0)

不,没有这样的把戏。此示例与

相同
struct X;
constexpr X getx();

struct X {
    static constexpr X x = getx();

};

按照标准,不完整的类不能用作constexpr变量

  

在对象声明中使用的constexpr说明符声明   对象为const。此类对象应具有文字类型,并且应为   初始化。

这时,编译器甚至不知道类型是否为文字类型,因此它不能接受不完整的类。