乍一看,它似乎是简单的语法糖。
但是当深入研究时,我们发现它不仅仅是语法糖,因为它扩展了 C++ 用户的选项来创建行为与不同的内置类型完全相同的用户定义类型。在此,这个小小的“奖励”是对 C++ 的一个非常有趣的 C++11 补充。
我们真的需要在 C++ 中使用它吗?
我在过去几年编写的代码中几乎没有看到任何用途,但仅仅因为我没有在 C++ 中使用它并不意味着它对其他 C++ 开发人员没有兴趣。
我们曾在 C++(我猜也是 C)中使用编译器定义的文字,将整数输入为短整数或长整数,将实数输入为浮点数或双精度数(甚至长双精度数),将字符串输入为普通字符或宽字符.
在 C++ 中,我们有可能创建自己的类型(即类),而可能没有开销(内联等)。我们有可能将运算符添加到它们的类型中,让它们表现得像类似的内置类型,这使 C++ 开发人员能够像将它们添加到语言本身一样自然地使用矩阵和复数。我们甚至可以添加强制转换运算符(这通常是一个坏主意,但有时,它只是正确的解决方案)。
我们仍然错过了让用户类型表现为内置类型的一件事:用户定义的文字。
所以,我想这是语言的自然演变,但要尽可能完整:“如果你想创建一个类型,并且希望它尽可能地像内置类型一样表现,这里有工具。 …… ”
我猜这与 .NET 将每个基元都设为结构(包括布尔值、整数等)并让所有结构派生自 Object 的决定非常相似。仅此一项决定就使 .NET 在处理原语时远远超出了 Java 的范围,无论 Java 将在其规范中添加多少装箱/拆箱 hack。
你真的需要在 C++ 中使用它吗?
这个问题是你来回答的。不是 Bjarne Stroustrup。不是赫伯萨特。不是 C++ 标准委员会的任何成员。这就是为什么您可以在 C++ 中进行选择的原因,它们不会将有用的符号单独限制为内置类型。
如果您需要它,那么它是一个受欢迎的补充。如果你不这样做,那么......不要使用它。它不会花费你任何东西。
欢迎使用 C++,这是一种可选功能的语言。
臃肿???给我看看你的情结!!!
臃肿和复杂(双关语)是有区别的。
就像 Niels 在用户定义的文字添加到 C++ 中的哪些新功能?,能够编写复数是“最近”添加到 C 和 C++ 的两个特性之一:
// C89:
MyComplex z1 = { 1, 2 } ;
// C99: You'll note I is a macro, which can lead
// to very interesting situations...
double complex z1 = 1 + 2*I;
// C++:
std::complex<double> z1(1, 2) ;
// C++11: You'll note that "i" won't ever bother
// you elsewhere
std::complex<double> z1 = 1 + 2_i ;
现在,C99“双复数”类型和 C++“std::complex”类型都可以使用运算符重载进行乘法、加法、减法等。
但是在 C99 中,他们只是添加了另一种类型作为内置类型,以及内置的运算符重载支持。他们添加了另一个内置的文字功能。
在 C++ 中,他们只是使用了该语言的现有特性,看到字面特性是该语言的自然演变,因此添加了它。
在 C 中,如果您需要对另一种类型进行相同的符号增强,那么在游说将您的量子波函数(或 3D 点,或您在工作领域中使用的任何基本类型)添加到C 标准作为内置类型成功。
在 C++11 中,你可以自己做:
Point p = 25_x + 13_y + 3_z ; // 3D point
是不是臃肿?不,需求是存在的,正如 C 和 C++ 复合体都需要一种方法来表示它们的字面复合值所示。
是不是设计错了?不,它的设计与其他所有 C++ 功能一样,并考虑到了可扩展性。
它仅用于符号目的吗?不,因为它甚至可以为您的代码添加类型安全性。
例如,让我们想象一个面向 CSS 的代码:
css::Font::Size p0 = 12_pt ; // Ok
css::Font::Size p1 = 50_percent ; // Ok
css::Font::Size p2 = 15_px ; // Ok
css::Font::Size p3 = 10_em ; // Ok
css::Font::Size p4 = 15 ; // ERROR : Won't compile !
然后很容易对值的分配强制执行强类型。
是不是很危险?
好问题。这些函数可以命名空间吗?如果是,那么大奖!
无论如何,就像所有事情一样,如果工具使用不当,您可能会自杀。C很强大,如果你误用C枪,你可以把你的头打掉。C++ 有 C 枪,还有手术刀、泰瑟枪以及工具包中的任何其他工具。你可以滥用手术刀,让自己流血致死。或者你可以构建非常优雅和健壮的代码。
那么,就像每个 C++ 特性一样,你真的需要它吗?这是在 C++ 中使用它之前必须回答的问题。如果你不这样做,它不会花费你任何东西。但是,如果您确实需要它,至少该语言不会让您失望。
日期示例?
在我看来,您的错误是您正在混合运算符:
1974/01/06AD
^ ^ ^
这是无法避免的,因为 / 作为运算符,编译器必须解释它。而且,AFAIK,这是一件好事。
为了找到您的问题的解决方案,我会以其他方式编写文字。例如:
"1974-01-06"_AD ; // ISO-like notation
"06/01/1974"_AD ; // french-date-like notation
"jan 06 1974"_AD ; // US-date-like notation
19740106_AD ; // integer-date-like notation
就个人而言,我会选择整数和 ISO 日期,但这取决于您的需要。这就是让用户定义自己的文字名称的全部意义所在。