【发布时间】:2020-11-23 14:16:21
【问题描述】:
在我的 c++ 项目中,我有一个名为 Expression 的类型
typedef std::function<uint64_t(uint64_t)> Expression;
我还有一个类似构造函数的函数
Expression ExpressionConstructor(std::string Expr, MicroCodeDescriptor* descriptor) {
//implementation doesn't matter in this case
}
这段代码有效,我可以像这样使用表达式类型:
Expression expr= ExpressionConstructor(code, descriptor);
但是有没有办法为 Expression 声明一个构造函数,它在语法上像构造函数而不是像一个单独的函数一样工作,我看不出有任何理由说明这根本不可能,因为构造函数只是具有返回类型的函数他们构造的类。
【问题讨论】:
-
ExpressionConstructor看起来像一个工厂函数,除了它有一个奇怪的名称。您不想使用工厂函数并且需要行为类似于构造函数的东西的原因是什么?。 -
构造函数没有 any 返回类型。构造函数和析构函数是“特殊”函数,它们没有名字,不返回任何东西,也不能被调用。
-
@GideonMax 标准(参见
[special]部分。)对此非常明确:“构造函数没有名称。” (因此,您不能在调用或其他任何事情中引用它)和“构造函数用于初始化其类类型的对象。” (因此,它不创建对象,更不用说返回一个对象。)编译器当然可以引用构造函数并调用它,但你不能,编译器使用什么名称以及如何调用它是完全不相关的实现细节. -
@molbdnilo 1. 构造函数接收将用于对象的地址并返回它,反汇编不会说谎。 2. ``` CodeTreePart part(str); CodeTreePart 部分=CodeTreePart::CodeTreePart(str); ```这两行代码(几乎)是等价的,并且都有效且有效(我对此进行了测试)不确定您指的是什么,但现实世界不同意,您确定您没有阅读旧的 c++ 标准吗? p.s.两行之间的区别在于第二个初始化然后分配,第一个只是初始化
-
@GideonMax 任何非初学者都知道,
CodeTreePart part=CodeTreePart::CodeTreePart(str);不是一个任务(我不知道你想用那个例子说明什么)。而且你无法通过研究生成的代码来确定语言语义。