C++ 用户定义的文字如何与数字分隔符一起使用?
我刚刚修改了一个旧的代码示例,在用户定义的文本中添加了一个数字分隔符,由可变模板解析:C++ 用户定义的文字如何与数字分隔符一起使用?,c++,variadic-templates,user-defined-literals,digit-separator,C++,Variadic Templates,User Defined Literals,Digit Separator,我刚刚修改了一个旧的代码示例,在用户定义的文本中添加了一个数字分隔符,由可变模板解析: namespace lits { // helper for 1 arg template<char C> int bin(); // common template<> int bin<'1'>() { return 1; } // spec. template<> int bin<'0'>() { ret
namespace lits {
// helper for 1 arg
template<char C> int bin(); // common
template<> int bin<'1'>() { return 1; } // spec.
template<> int bin<'0'>() { return 0; } // spec.
// helper 2 or more args
template<char C, char D, char... ES>
int bin() {
return bin<C>() << (sizeof...(ES)+1) | bin<D,ES...>() ;
}
// operator"" _bin
template<char...CS> int operator"" _bin()
{ return bin<CS...>(); };
}
int main() {
using namespace lits;
int number = 1000'0000_bin; // <<< I added a ' here
}
输出为:
10000000
10'000'000
0x00af
0x0'c'0'a'f
007
0b01
这意味着模板获取所有字符:前缀和数字分隔符——所有字符。(g++-6.2.0)
正如@krzaq的回答所暗示的,这似乎是性病的计划,因此人们可以信赖它。据我所知,是的。如前所述,数字分隔符是用户定义的整数文本的合法成员 模板整数文本定义为: N4140§2.13.8[法律分界]/3 否则(S包含文本运算符模板),将处理L 作为一种形式的呼唤
operator "" X <’c1’, ’c2’, ... ’ck’>()
运算符“”X()
其中n是源字符序列c1c2…ck。[注:顺序如下:
c1c2…ck只能包含字符
来自基本源字符集。-结束注释]
没有关于删除分隔符的文字。正如我所读的那样,只有当您将文本作为数字获取时,才允许使用分隔符,而不是当运算符是原始文本时。这意味着,如果运算符参数类型为
unsigned long long
,而不是获取C-string或char的原始类型,编译器将去掉分隔符。考虑一下01
和1
在解释为int
时的含义是完全相同的,然而,您可能希望对01_-bin
和1_-bin
进行不同的解释(长度为2的位字符串与长度为1的位字符串)。不管标准怎么说(已经有答案了),你收到用户使用的准确拼写是有道理的。这取决于你决定哪些拼写差异重要,哪些不重要。那将是令人惊讶的!人们可以将数字sep用作所有类型的sep,比如复数。52.84+67.12i的'52.84'67.12i'的行为是否定义得很好?'从链接问题的答案来看,这似乎与此处描述的chrono
行为一致,即原始文字运算符按原样获取分隔符,而煮熟的运算符(获取ull
)忽略它。不幸的是,我在标准文本中找不到足够清晰的参考。如果
使用它,@howard hinnant经常观看这个网站。也许他会看到的。
operator "" X <’c1’, ’c2’, ... ’ck’>()