【问题标题】:Which user-defined-literals are predefined by the standard?标准预定义了哪些用户定义文字?
【发布时间】:2011-07-19 19:37:14
【问题描述】:

我的问题听起来很矛盾,但除了user-defined-literal 之外,我不知道如何引用新的文字语法。

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 鉴于提案试图将它们从 C11 中删除并将它们推送到标准的以后迭代,并且 C11 现在已经发布与 i> 他们,我们可能会忽略上述提议 :-)
    【解决方案2】:

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

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

    整数后缀uUlLllLL

    浮动后缀fFlL

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        另一个是bitset:

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

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

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

        【讨论】:

        • 请注意,该标准明确保留 all 不以下划线开头的文字后缀以供将来标准化。
        猜你喜欢
        • 2017-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-26
        • 1970-01-01
        • 2010-10-30
        • 2013-11-15
        • 2014-01-02
        相关资源
        最近更新 更多