未找到用户定义的字面量运算符。

3
我正在阅读CppCoreGuidelines的哲学部分,发现了一个我不理解的例子。(https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-philosophy
代码示例如下;
change_speed(double s);   // bad: what does s signify?
// ...
change_speed(2.3);

change_speed(Speed s);    // better: the meaning of s is specified
// ...
change_speed(2.3);        // error: no unit
change_speed(23m / 10s);  // meters per second

我的问题与最后一行有关。我假设指南建议像这样定义Speed;

typedef int Speed;

但在示例的最后一行中,它们使用了m和s作为参数的一部分。如果我尝试相同的操作,只会出现错误提示:"找不到用户定义的字面值操作符"。

这个应该怎么工作?


3
使用typedef并不比直接使用double更好。虽然它可能使您的代码更易读(有人可能这么认为),但在类型安全方面它并没有增加任何内容,您仍然可以传递2.3。只有使用显式构造函数的类Speed才能添加类型安全性。 - StoryTeller - Unslander Monica
http://blog.m-ou.se/2013/09/29/compile-time-unit-arithmetic.html - Karoly Horvath
2
应该是 23_m10_s。对于用户定义字面量,你尝试过在搜索引擎中输入这个术语吗? - Yakk - Adam Nevraumont
@StoryTeller 网页上的示例没有说明 Speed 是如何定义的,我猜我们应该通过倒数第二行的错误来确定它是一个类。 - Barmar
@Barmar-用户定义字面值符号都是关于类型安全的。自我文档化很好,但如果编译器可以捕捉这样的错误,我更喜欢它。在他们的书中,Abrahams和Gurtovoy介绍了如何利用类型系统来获得科学程序中单位错误的编译器错误。std :: chrono也做了类似的事情。 - StoryTeller - Unslander Monica
@Barmar - 我们强烈认为这是一个类(虽然不一定是,因为将 m 除以 s 可能会被重载以返回一个普通的 double,但这种情况不太可能)。 - StoryTeller - Unslander Monica
1个回答

7

My question is regarding the last line. I'm assuming that the guidelines recommends defining Speed like this;

typedef int Speed;
不是的。他们期望的是类似于以下内容:
class Speed {
    double value;
public:
    ....
}

class Distance {
     double value;
public:
     ...
};

class Time {
     double value;
public:
     ....
};

Speed operator /(Distance d, Time t);

还需要一对用户自定义字面量操作符来处理距离和时间

Distance operator "" _m(double);

Time operator "" _s(double);

然而,这个例子中存在一个bug。正确的写法是:

change_speed(23_m / 10_s);  // meters per second

1
谢谢,我所做的唯一更改是将操作符定义为使用“long double”而不是“double”,在调用change_speed时,我使用了23.0_m而不是23_m。 - Frode Lillerud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接