标准预定义了哪些用户定义的文字?

时间:2011-03-21 16:10:46

标签: c++ c++11 user-defined-literals

我的问题听起来像是一个矛盾,但我不知道如何引用user-defined-literal以外的新文字语法。

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

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

我记得听说用户定义的文字应该以{{1​​}}前缀开头。这意味着图书馆为我们定义了一些非前缀文字。

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

4 个答案:

答案 0 :(得分:6)

标准库实际上定义了 no 用户定义的文字。我们可能已经预料到了复数,但没有。

另一方面,还有建议再次删除它们

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

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

答案 1 :(得分:5)

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

如果您将U用作用户定义的文字,那么这将是不明确的,因此建议。

整数后缀uUlLllLL < / p>

浮动后缀fFlL

答案 2 :(得分:2)

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

  

如果令牌与 user-defined-literal 和另一种文字类型相匹配,则将其视为后者。
  [示例:    123_km 用户定义的文字,但 12LL 整数文字。 - 结束示例]

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

答案 3 :(得分:1)

没有标准库组件对用户定义的文字进行索赔。 @Bo提到复杂的可能性。

另一个是bitset:

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

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

我预计会在后缀命名空间上发生一些冲突。您可以在命名空间中声明文字运算符并防止多个不明确的定义,但是您无法通过实际文字中的命名空间来区分实际后缀。我们会看到。