问题标签 [user-defined-literals]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
12 回答
37450 浏览

c++ - 用户定义的文字为 C++ 添加了哪些新功能?

C++11引入了用户定义的文字,这将允许基于现有文字(int, hex, string, float)引入新的文字语法,以便任何类型都能够有文字表示。

例子:

乍一看,这看起来很酷,但我想知道它到底有多适用,当我尝试考虑使用后缀_AD_BC创建日期时,我发现由于操作员的顺序而存在问题。1974/01/06_AD将首先评估1974/01(作为plain ints),然后才评估(06_AD更不用说八月和九月必须在没有0八进制原因的情况下编写)。这可以通过使用语法来解决,1974-1/6_AD以便运算符评估顺序有效,但它很笨重。

所以我的问题归结为这个,你觉得这个功能会证明自己的合理性吗?您还想定义哪些其他文字以使您的 C++ 代码更具可读性?


更新语法以适应 2011 年 6 月的最终草案

0 投票
3 回答
797 浏览

c++ - C ++ 11的用户定义文字(扩展文字)......哪些编译器支持它?

另一个线程中,我介绍了一些技术,一旦 C++11 功能(特别是用户定义的文字)可用,我们将用于 C++ 中的模型驱动开发。我刚刚修改了 GCC 4.5 甚至 4.6 的计划,它表明不支持此特定功能。

无论如何,您是否知道我是否有任何编译器来测试该功能以开始设计/实现算法,直到 C++11 被批准并在主流免费编译器(LLVM、GCC)中实现?

0 投票
1 回答
999 浏览

c++ - c++0x中用户定义文字的重载规则

我对重载规则有点困惑,

假设有以下文字运算符,

如果同时定义了 1、2 和 3,则重载很明显,

如果定义了 1 & 2,

如果定义了 2 & 3

混淆来自最新的 c++0x 标准 n3225 2.14.8/3,

如果 L 是用户定义的整数文字,则令 n 为不带 ud 后缀的文字。如果 S 包含参数类型为 unsigned long long 的文字运算符,则文字 L 被视为以下形式的调用

运算符 "" X (n ULL)

否则,S 应包含原始文字运算符或文字运算符模板(13.5.8),但不能同时包含两者。如果 S 包含原始文字运算符,则文字 L 被视为形式的调用

运算符 "" X ("n")

否则(S 包含文字运算符模板),L 被视为形式的调用

运算符 "" X <'c1', 'c2', ... 'ck'>()

其中 n 是源字符序列 c1c2...ck。

这表示,如果存在 1(无符号长长参数),13_xx 将调用 1,否则,13_xx 将调用 2。从 13.5.8 开始,

特别是,它们像普通函数和函数模板一样被查找,并且遵循相同的重载决议规则。

据我了解,如果 1 不存在,则 13_xx 可以隐式转换为 double 并调用 3。

因此,如果 1 不存在,则 2 和 3 在标准描述中都是有效的。

我希望有人可以帮助我消除我的疑惑。非常感谢。

0 投票
4 回答
706 浏览

c++ - 标准预定义了哪些用户定义文字?

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

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

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

0 投票
2 回答
1784 浏览

c++ - 用户定义的文字是在编译时还是运行时解析的?

ULL我想知道,因为像,等预定义的文字f显然是在编译时解决的。标准(2.14.8 [lex.ext])似乎没有定义这一点,但它似乎倾向于运行时:

[2.14.8 / 2]
用户定义的文字被视为对文字运算符或文字运算符模板 (13.5.8) 的调用。为了确定对带有 ud-suffix X 的给定用户定义文字 L 的此调用的形式,使用非限定名称查找规则在 L 的上下文中查找其文字后缀标识符为 X 的literal-operator-id ( 3.4.1)。令 S 是此查找找到的声明集。S 不能为空。
(强调我的。)

但是,对我来说,这似乎引入了不必要的运行时开销,因为文字只能附加到编译时可用的值,例如13.37for "hello"_x_x用户定义的文字在哪里)。
然后,我们得到了模板化的用户定义文字,它从未真正在标准 AFAICS 中得到定义(即,没有给出示例,请证明我错了)。该函数是在编译时以某种方式神奇地调用还是仍然是运行时?

0 投票
4 回答
1017 浏览

c++11 - 用户定义的文字后缀,带 *_digit..."?

C ++0x中用户定义的文字后缀应该是一个标识符

  • _(下划线)开头(17.6.4.3.5)
  • 不应以大写字母开头(17.6.4.3.2 )_

    [...] 以下划线后跟大写字母开头的每个名称都保留给实现以供任何使用。

有什么理由,为什么这样的后缀不能_ 以数字开头?IE_4_3musketeers?

0 投票
3 回答
926 浏览

c++ - C++0x,使用友元运算符 ""() 的用户定义文字

operator "" (...)将 an 定义为友元函数是否可能和/或有用?

我正在考虑“有用”,特别是因为operator ""应该只在命名空间中定义的规则——尤其是因为以开头的标识符_被保留在全局命名空间中。这friend违反了这个规则吗?所以,这种不完全的封装不会有任何好处,对吧?

0 投票
4 回答
246 浏览

c++ - 用户定义的文字可以将函数作为参数吗?

函数可以与用户定义的文字一起使用吗?

如果是这样,可以做些什么恶作剧?这合法吗?

0 投票
5 回答
4778 浏览

c++ - 用户定义的文字参数不是 constexpr?

我正在测试用户定义的文字。我想_fac返回数字的阶乘。

让它调用一个constexpr函数是可行的,但是它不允许我用模板来做,因为编译器抱怨参数 is not 和 cannot be constexpr

我对此感到困惑-文字不是常量表达式吗?5in始终是一个可以在编译时评估的5_fac文字,那么为什么我不能这样使用它呢?

第一种方法:

第二种方法:

0 投票
2 回答
2328 浏览

c++ - 如何将用户定义的文字中的可变 char 模板参数转换回数字类型?

这个问题是因为这个而被问到的。

C++11 允许你为数字文字定义这样的文字:

这意味着这503_suffix将成为<'5','0','3'>

这很好,虽然它的形式不是很有用。

如何将其转换回数字类型?这将<'5','0','3'>变成一个constexpr 503. 此外,它还必须适用于浮点文字。<'5','.','3>会变成int 5float 5.3

在上一个问题中找到了部分解决方案,但它不适用于非整数: