问题标签 [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.
c++ - 用户定义的文字中是否允许使用 C++14 位分隔符?
虽然 clang 编译了以下行,但 g++ 6.1 抱怨数字分隔符(参见Coliru 上的实时示例):
根据 C++14 标准 (N3796),哪个编译器(如果有)是正确的?
否则,是否允许数字分隔符(第 2.14.2 节)只是<chrono>
库(第 20.12.5.8 节)的用户定义文字(第 2.14.8 节)中的一个实现细节?恕我直言,不应该,因为这些文字是在unsigned long long
参数上定义的。
我记得 Howard Hinnant 在他的CppCon 2016 演讲“A tutorial”(在他的演讲中大约 42 分钟)中使用10'000s
了一个例子。<chrono>
(请注意,我不打算编写“1 分 23 秒”,这只是偶然正确,因为八进制文字 0123 是 64 + 16 + 3 == 83。为此我应该写
但可能的误导性解释不是问题的一部分。)
c++ - 为什么此模板签名不能用作使用引号的字符串文字?
C++11 允许用户定义的模板字符串文字运算符,具有以下模板签名(取自 CppReference;返回类型不需要是double
):
但是,这似乎只适用于数字形式,而不是引用形式:
GCC (5.1) 和 Clang (3.7) 都没有给出有用的错误信息。海湾合作委员会 说:
Clang 简单地说:
那么为什么模板参数推导失败呢?为什么文字运算符模板不匹配?
而且,一般来说,是否可以修复用法以便template <char...>
文字运算符可以与非数字字符串一起使用?
c++ - 用户定义的文字如何与数字分隔符一起使用?
我只是通过向用户定义的文字添加一个数字分隔符来修改我的代码的一个旧示例,由可变参数模板解析:
男孩,当g++6.2.0尝试实例化bin<'\''>
. 它试图将'
as传递char
给我的模板template<char...CS> int operator"" _bin()
!我用clang++-3.9和msvc++-19.00尝试过,同样的抱怨,这真的让我怀疑。
我觉得这可能不是正确的行为。如果我的文字用引号括起来,我会理解的"1000'0000"_bin
,但是模板运算符“”不存在这种形式,对吗?
我现在是否也希望'
在我的模板用户文字运算符中使用数字分隔符?
更新1:如果'
没问题:
可以将 digit-sep 用作各种事物的 sep,例如复数。'52.84'67.12_i' 对52.84+67.12i的行为会被很好地定义吗?
更新2:作为一些评论的反应。以下编译:
输出是:
这意味着模板获取所有字符:前缀和数字分隔符——所有这些。(g++-6.2.0)
正如@krzaq 的回答所暗示的那样,这似乎是标准的计划,所以人们可以依赖它。
c++ - 任何类型的 C++ 用户定义文字
目前,用户定义的文字接受一组有限的类型作为输入参数(参见此处)。有没有计划接受任何类型作为输入参数,如果没有,为什么会这样?
例如,我可能希望能够以不同的格式(秒、毫秒等)获得 std::chrono::duration,并且会执行类似的操作
c++ - 如何将用户定义的文字用于复数?
当我尝试执行时我做错了什么std::pow(1.0i, 2)
?是我对用户定义文字的理解operator""i
,还是我如何使用复杂的pow
-overload?
使用 g++-6.2 或 g++-5 编译时,最后一行显示错误:
消息是:
如果我省略最后一行,一切都很好。
c++ - 如何使 [std::operator""s] 在命名空间中可见?
错误信息是:
错误:没有匹配的文字运算符用于调用具有类型参数'unsigned long long'或'const char *'的'operator""s',并且没有匹配的文字运算符模板std::chrono::seconds d = 0s;
我的问题是:
我不想use namespace std;
进去namespace Y
;那么,我应该如何使其std::operator""s
可见namespace Y
?
c++ - 使用保留标识符时,using 命令是否应该发出警告?
使用线路时
在 g++ 6.3.0 中,编译器发出警告说明:
警告:不以“_”开头的文字运算符后缀保留用于将来的标准化
MSVS 中也发出了类似的警告。然而,clang 3.8.0 没有发出这样的警告。
由于operator""s
由 chrono 库的标准定义,这不应该不会发出警告,因为我们只是导入名称而不定义名称?
c++ - 我可以模板化用户定义的文字吗?
假设我有一些课程:
我提供了一些创建Foo
对象的用户定义文字:
我的问题是:为什么我不能对这些模板进行模板化而不必重写代码?
gcc 5.4.0(Ubuntu 5.4.0-6ubuntu1~16.04.4)和7.0.0(自己编译)报告:
错误消息似乎很清楚,但我看不出原则上不应允许我这样做的原因;那么,我这样做是不正确的,还是真的不允许这样做?