C ++ 11台引入了用户定义的文字,这将允许基于现有字面引入新文本语法的(int
,hex
,string
,float
),使得任何类型的将能够具有字介绍。
例子:
// imaginary numbers
std::complex<long double> operator "" _i(long double d) // cooked form
{
return std::complex<long double>(0, d);
}
auto val = 3.14_i; // val = complex<long double>(0, 3.14)
// binary values
int operator "" _B(const char*); // raw form
int answer = 101010_B; // answer = 42
// std::string
std::string operator "" _s(const char* str, size_t /*length*/)
{
return std::string(str);
}
auto hi = "hello"_s + " world"; // + works, "hello"_s is a string not a pointer
// units
assert(1_kg == 2.2_lb); // give or take 0.00462262 pounds
乍一看,这看起来很酷,但我想知道它的实际用途是什么,当我尝试考虑使用后缀_AD
并_BC
创建日期时,我发现由于操作员的命令这是有问题的。1974/01/06_AD
会先评估1974/01
(以int
s开头),然后再评估(06_AD
不用说八月和九月,0
因为八进制原因而不必编写)。可以通过使语法为be来解决1974-1/6_AD
此问题,以使运算符评估顺序有效,但是比较笨拙。
因此,我的问题归结为这是什么,您是否认为此功能可以证明其合理性?您还想定义哪些其他文字来使您的C ++代码更具可读性?
更新了语法以适合2011年6月的最终草案
string operator "" _s(const char*s);"
不能用于解析"hello"_s"
。这是一个字符串文字,将使用附加size_t
参数查找运算符。我对吗?
uint16_t
,用类似的类型替换其行为是依赖于实现的行为,uwrap16
而unum16
其行为将是与实现无关的类型,从而给定uwrap16 w=1; unum16 n=1;
表达式w-2
和n-2
将分别产生(uwrap16)65535
和(int)-1
,[ uint16_t
将在int
16位的系统上产生第一个结果,而在int
较大的系统上产生第二个结果]。我看到的最大问题是处理数字文字。
sizeof
返回依赖于实现的整数类型之类的事情,IDB仍然是不可避免的,但是这种情况仍然可以比现在好很多。您如何看待这个概念?