我想实现自己的字符串文字类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 = 0
和empty
放在某个地方,并在编译时将其分配给static我班的实例。
是否有一些“技巧”来实现类似auto new_literal = Literal::empty;
的子句?
答案 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。此类对象应具有文字类型,并且应为 初始化。
这时,编译器甚至不知道类型是否为文字类型,因此它不能接受不完整的类。