标准中预定义了哪些用户自定义字面量?

10

我的问题听起来有些矛盾,但我不知道除了user-defined-literal之外如何称呼新的文字字面量语法。

std::string operator "" s ( const char* str, size_t len )
{
   return std::string( str, len );
}

assert( "foo"s == "bar"s );

我记得听说用户定义字面量应该以_前缀开头。这意味着库会为我们定义一些无前缀的字面量。

标准库中是否提供了某些UDLs?
如果有,它们是什么?

4个回答

6

鉴于该提案试图将它们从C11中移除并推迟到标准的后续版本,而C11现在已经发布并包含了它们,我们可以忽略该提案 :-) - paxdiablo

5
该语言已经使用了常规字面量后缀,例如1U
如果您要使用U作为用户定义的文字,就会变得模糊不清,因此建议避免使用。
整数后缀: u, U, l, L, ll, LL 浮点数后缀: f, F, l, L

2
与@Matthieu的答案相反,FIDS在2.14.8 [lex.ext] p1下表示如下:
如果一个标记既符合用户定义字面量又符合另一种字面量类型,则将其视为后者。 [ 例如: 123_km用户定义字面量,但12LL整数字面量。 — 结束示例 ]
因此,即使您定义了这些字面量,预定义的字面量也会被使用,不存在歧义。

1

没有标准库组件可以声明用户定义的字面值。@Bo提到复数可能是一种选择。

另一个选择是位集:

template<char... Bits>
  inline constexpr std::bitset<sizeof...(Bits)>
  operator"" bits()
  {
    return std::bitset<sizeof...(Bits)>((char []){Bits..., '\0'});
  }

我预测在即将到来的库TR2增强中,会有各种库组件的字面运算符提案。

我预计后缀命名空间会发生一些冲突。您可以在命名空间中声明字面运算符并防止多个模糊定义,但是您无法通过实际字面值区分命名空间中的实际后缀。我们拭目以待。


1
请注意,标准明确保留了所有不以下划线开头的文字后缀,以备将来标准化使用。 - Nicol Bolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接