Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用户定义的文字如何与数字分隔符一起使用?_C++_Variadic Templates_User Defined Literals_Digit Separator - Fatal编程技术网

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’>()