【问题标题】:What does the operator"" do in C++?运算符“”在 C++ 中做了什么?
【发布时间】:2020-08-12 11:05:00
【问题描述】:

你怎么称呼这个操作员?

除了创建自定义文字之外,您可以将它用于其他用途吗?

示例用法:(参见cppreference

constexpr long double operator"" _deg ( long double deg )
{
    return deg * 3.14159265358979323846264L / 180;
}

【问题讨论】:

  • 这是一个用户定义的文字操作符。在模块之前将其引入 C++ 的上下文中浪费时间!
  • 除了创建自定义文字之外,您可以将它用于其他用途” - 从您包含的链接中:“[...] 除了限制上面,字面运算符和字面运算符模板是普通函数(和函数模板),它们可以声明为inlineconstexpr,它们可以有内部或外部链接,可以显式调用,可以取地址等."
  • 我不得不说这是用户定义文字的一个非常糟糕的例子。它让你输入30_deg,但你得到的是弧度!它使代码撒谎。
  • 我不同意。 30_deg 仍然代表 30 度,但只是以弧度表示。所以你得到的正是你所承诺的
  • 不,你不能拿回学位。你得到一个长双。你写了“deg”,你期望双倍的学位。你将它输入一些 API,然后……崩溃。 API 期望度数,而不是弧度,并且您认为您提供了度数,但这是一个谎言。我猜人们忘记了火星气候轨道飞行器的教训。

标签: c++ operator-overloading user-defined-literals


【解决方案1】:

operator"" 的主要用途是创建用户定义的文字。来自reference

通过定义用户定义的后缀,允许整数、浮点、字符和字符串字面量生成用户定义类型的对象。


您可以像调用任何其他重载运算符一样调用此运算符:

std::cout << 42.5_deg;                // with convenient operator syntax
std::cout << operator"" _deg(42.5);   // with an explicit call

并非完全不相关:正如您的问题的 cmets 所指出的,这个例子的名字很糟糕。它以度为单位并返回弧度,因此它应该命名为operator"" _rads。 UDL 的目的是提供方便、易于阅读的语法,以及一个隐瞒它所做的事情的功能,从而积极地破坏了这一点。


您可以使用此运算符进行几乎任何您想要的计算(对传入的参数类型和数量进行限制,类似于其他运算符),例如:

constexpr long double operator"" _plus_one ( long double n )
{
    return n + 1;
}

虽然这个操作符的用法还是和上面一样。

这是demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2016-07-22
    • 2013-09-15
    相关资源
    最近更新 更多