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

发布于 2024-10-25 02:15:33 字数 335 浏览 5 评论 0原文

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

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

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

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

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

My question sounds like a contradiction, but I don't know how else to refer to the new literal syntax other than user-defined-literal.

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

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

I remember hearing that user defined literals should start with an _ prefix. That would imply that the library defines some non-prefixed literals for us.

Does the standard provide some UDLs in the the standard library?
If yes, what are they?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

荒路情人 2024-11-01 02:15:33

标准库实际上定义了没有用户定义的文字。我们也许期望复数,但事实并非如此。

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

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

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

The standard library actually defines no user defined literals. We would perhaps have expected complex numbers, but no.

On the other hand, there is also a proposal to remove them again

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

so we don't yet know what happens.

柠栀 2024-11-01 02:15:33

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

如果您使用 U 作为用户定义的文字,那么它会变得不明确,因此是推荐的。

整数后缀uUlLllLL

浮动后缀fFl, L

The language already use regular literals suffixes, for example 1U.

It would become ambiguous if you were to use U as a user-defined-literal, thus the recommendation.

integer-suffix: u, U, l, L, ll, LL

floating-suffix: f, F, l, L

旧人哭 2024-11-01 02:15:33

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

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

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

In contrast to @Matthieu's answer, the FIDS says the following under 2.14.8 [lex.ext] p1:

If a token matches both user-defined-literal and another literal kind, it is treated as the latter.
[ Example:
123_km is a user-defined-literal, but 12LL is an integer-literal. — end example ]

So even if you define those literals, the predefined ones are taken and there is no ambiguity.

三生一梦 2024-11-01 02:15:33

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

另一个是 bitset:

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

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

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

No standard library components have staked a claim on a user-defined literal. @Bo mentioned complex as a possibility.

Another is bitset:

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

I predict there will be proposals for literal operators for various library components in the upcoming library TR2 enhancements.

I anticipate some collisions over the suffix namespace. You can declare literal operators in a namespace and prevent multiple ambiguous definitions but you can't distinguish the actual suffixes by namespace in an actual literal. We'll see.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文