10

我的问题听起来很矛盾,但我不知道如何引用除user-defined-literal.

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

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

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

标准是否在标准库中提供了一些 UDL?
如果是,它们是什么?

4

4 回答 4

6

标准库实际上没有定义用户定义的文字。我们可能会期望复数,但没有。

另一方面,也有提议再次移除它们

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3250.html

所以我们还不知道会发生什么。

于 2011-03-21T16:51:34.610 回答
5

该语言已经使用常规文字后缀,例如1U.

如果您将其U用作用户定义的文字,则会变得模棱两可,因此建议。

整数后缀: u, U, l, L, ll,LL

浮动后缀: f, F, l,L

于 2011-03-21T16:23:07.147 回答
2

与@Matthieu的回答相反,FIDS在 2.14.8 [lex.ext] p1 下说明了以下内容:

如果一个标记同时匹配用户定义的文字和另一种文字,则将其视为后者。
[示例: 123_km用户定义的文字,但12LL整数文字。—结束示例]

因此,即使您定义了这些文字,也会采用预定义的文字并且没有歧义。

于 2011-04-16T03:12:16.890 回答
1

没有标准库组件对用户定义的文字提出要求。@Bo 提到了复杂的可能性。

另一个是位集:

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

我预测在即将到来的库 TR2 增强功能中,将会有针对各种库组件的文字运算符的建议。

我预计后缀命名空间会发生一些冲突。您可以在命名空间中声明文字运算符并防止出现多个模棱两可的定义,但您无法在实际文字中按名称空间区分实际后缀。我们拭目以待。

于 2011-10-26T17:51:59.550 回答