【问题标题】:user defined string literal, is string null terminated?用户定义的字符串文字,字符串是否以空值终止?
【发布时间】:2017-06-27 12:01:14
【问题描述】:

对于用户定义的字符串文字,如果我使用以下定义形式,给定的字符串是否保证为空?我知道第二个参数给出的大小没有任何终止,如果有的话。

void operator"" _x( const char* n, size_t s)
{
    std::cout << "String: " << s << " Len: " << s << std::endl;
}

如果我使用这个版本的定义,我看不到空终止字符!

template <class T, T... Chrs>
void operator""_s() 
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
}

【问题讨论】:

  • @Rakete1111:写成:template &lt;char...&gt; void operator "" _d(){} "Hallo"_d; 格式不正确吗?这没有用 g++ 编译。这是否意味着不可能将任何模板化表单与用户定义的字符串文字一起使用?
  • 不,template&lt;char...&gt; type operator""_d() 是唯一允许的形式。模板的所有其他使用都是格式错误的。我不知道为什么它不能在 g++ 下编译,因为它为我这样做。
  • @Rakete1111:是的,编译为非字符串用户定义的文字。但我写了用户定义的 string 文字。你能用"test"_d;编译吗?
  • 是的,抱歉。我读你的评论太快了。你是对的,没有办法让用户定义 string 文字。

标签: c++ user-defined-literals


【解决方案1】:

用户定义的字符串字面量,字符串是否以null结尾?

void operator"" _x( const char* n, size_t s)

是的。字符串文字以 null 结尾,n 指向此类字符串文字。


如果我使用这个版本的定义,我看不到空终止字符!

template <class T, T... Chrs>
void operator""_s()

该标准不允许字符串文字模板。有文档N3599 提议将其添加到标准中,它是为 C++14 设计的,但是有 no consensus 并且它还没有成为标准的一部分。 GCC 和 Clang 至少似乎已经将其实现为语言扩展。

确实,文字运算符模板不接收空字符作为其参数之一。

提案 N3599:

其余参数是字符串文字中的代码单元(不包括其终止的空字符)。

【讨论】:

  • 您应该提到第二个版本是非标准的。 [over.literal] “文字运算符模板的声明应具有空的参数声明子句,并且其模板参数列表应具有单个模板参数,该模板参数是具有元素类型 char 的非类型模板参数包。 "
  • @AndyG 添加了提及。
  • 如何编写符合标准的函数版本?
  • @rex 没有标准的符合标准的方式来编写字符串文字模板。
  • 我已经重写了答案以更清楚地说明这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 2021-03-01
相关资源
最近更新 更多