用户定义的文字如何与数字分隔符一起使用?
How do user-defined literals play together with 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'>() { 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
}
男孩,当 g++6.2.0 试图实例化 bin<'\''>
时,我很惊讶。它试图将 '
作为 char
传递给我的模板 template<char...CS> int operator"" _bin()
!我用 clang++-3.9 和 msvc++-19.00 试过,同样的抱怨,这真的让我怀疑。
我觉得这可能不是正确的行为。如果我的文字用引号引起来,我会理解它,比如 "1000'0000"_bin
,但是模板运算符“”不存在这种形式,对吧?
现在我的模板用户文字运算符中是否也需要数字分隔符 '
?
更新 1: 如果 '
正常:
可以将数字 sep 用作各种事物的 sep,例如,复数。 52.84+67.12i 的 52.84'67.12_i' 的行为是否定义明确?'
更新 2: 作为对一些评论的回应。以下编译:
#include <iostream>
#include <string>
using std::string;
namespace lits {
// helper
template<char C> string sx() { return string{}+C; }
// helper 2 or more args
template<char C, char D, char... ES>
string sx() {
return sx<C>() + sx<D,ES...>();
}
// operator"" _sx
template<char...CS> string operator"" _sx()
{ return sx<CS...>(); };
}
int main() {
using namespace lits;
std::cout << 10000000_sx << '\n';
std::cout << 10'000'000_sx << '\n';
std::cout << 0x00af_sx << '\n';
std::cout << 0x0'c'0'a'f_sx << '\n';
std::cout << 007_sx << '\n';
std::cout << 0b01_sx << '\n';
// the following do not work:
//std::cout << 0b0a8sh3s1_sx << '\n';
//std::cout << "abcde"_sx << '\n';
}
输出为:
10000000
10'000'000
0x00af
0x0'c'0'a'f
007
0b01
这意味着模板获得 所有 字符:前缀和数字分隔符——全部。 (g++-6.2.0)
正如@krzaq的回答所暗示的那样,这似乎是Std的计划,因此可以放心。
据我所知,是的。正如所解释的 ,数字分隔符是用户定义的整数文字的合法成员。
模板整型字面量定义为:
N4140 § 2.13.8 [lex.ext] / 3
Otherwise (S contains a literal operator template), L is treated
as a call of the form
operator "" X <’c1’, ’c2’, ... ’ck’>()
where n is the source character sequence c1c2...ck. [ Note: The sequence
c1c2...ck can only contain characters
from the basic source character set. —end note ]
没有提到删除分隔符。
就我所读 here 而言,仅当您将文字作为数字获取时才允许使用分隔符,而不是当运算符是原始文字时。这意味着如果运算符参数类型是 unsigned long long
,编译器将去掉分隔符,如果它是获取 C 字符串或字符的原始参数之一。
我只是通过向用户定义的文字添加 数字分隔符 来修改我的代码的旧示例,由可变参数模板解析:
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
}
男孩,当 g++6.2.0 试图实例化 bin<'\''>
时,我很惊讶。它试图将 '
作为 char
传递给我的模板 template<char...CS> int operator"" _bin()
!我用 clang++-3.9 和 msvc++-19.00 试过,同样的抱怨,这真的让我怀疑。
我觉得这可能不是正确的行为。如果我的文字用引号引起来,我会理解它,比如 "1000'0000"_bin
,但是模板运算符“”不存在这种形式,对吧?
现在我的模板用户文字运算符中是否也需要数字分隔符 '
?
更新 1: 如果 '
正常:
可以将数字 sep 用作各种事物的 sep,例如,复数。 52.84+67.12i 的 52.84'67.12_i' 的行为是否定义明确?'
更新 2: 作为对一些评论的回应。以下编译:
#include <iostream>
#include <string>
using std::string;
namespace lits {
// helper
template<char C> string sx() { return string{}+C; }
// helper 2 or more args
template<char C, char D, char... ES>
string sx() {
return sx<C>() + sx<D,ES...>();
}
// operator"" _sx
template<char...CS> string operator"" _sx()
{ return sx<CS...>(); };
}
int main() {
using namespace lits;
std::cout << 10000000_sx << '\n';
std::cout << 10'000'000_sx << '\n';
std::cout << 0x00af_sx << '\n';
std::cout << 0x0'c'0'a'f_sx << '\n';
std::cout << 007_sx << '\n';
std::cout << 0b01_sx << '\n';
// the following do not work:
//std::cout << 0b0a8sh3s1_sx << '\n';
//std::cout << "abcde"_sx << '\n';
}
输出为:
10000000
10'000'000
0x00af
0x0'c'0'a'f
007
0b01
这意味着模板获得 所有 字符:前缀和数字分隔符——全部。 (g++-6.2.0)
正如@krzaq的回答所暗示的那样,这似乎是Std的计划,因此可以放心。
据我所知,是的。正如所解释的
模板整型字面量定义为:
N4140 § 2.13.8 [lex.ext] / 3
Otherwise (S contains a literal operator template), L is treated as a call of the form
operator "" X <’c1’, ’c2’, ... ’ck’>()
where n is the source character sequence c1c2...ck. [ Note: The sequence c1c2...ck can only contain characters from the basic source character set. —end note ]
没有提到删除分隔符。
就我所读 here 而言,仅当您将文字作为数字获取时才允许使用分隔符,而不是当运算符是原始文字时。这意味着如果运算符参数类型是 unsigned long long
,编译器将去掉分隔符,如果它是获取 C 字符串或字符的原始参数之一。