【发布时间】:2016-09-08 20:35:27
【问题描述】:
在 C++ 中,如果我写的话
token make_token() { return token{}; }
然后按如下方式使用
void use_token()
{
make_token();
// extra code
}
在没有为变量分配标记的情况下,token 的析构函数会在额外代码执行之前触发。如何让析构函数只在函数结束时触发而不必创建变量?
注意:我想完全避免制作变量。我知道我可以执行 auto& t = make_token() 或类似操作,但我想通过返回没有立即触发析构函数的 something(我不知道是什么)来避免这种情况。
为什么我想要这个: 基本上,在我的应用程序(编程语言的编译器)中,我有这些称为令牌的东西。令牌的构造函数可以放置 { 并缩进,然后其析构函数可以放置 } 并取消缩进。我认为设置按值返回这些标记的函数是个好主意,但我实际上不想将它们分配给任何值,因为标记是无用的并且没有任何功能。
为了减轻混淆,我的token 不是词法标记。我使用工作token 代替工作cookie。它意味着在构造函数中做一些事情,等到它的作用域结束,然后在它的析构函数中做一些事情。就是这样。顺便说一句,如果我用 C# 写这个,我会写类似的东西
using (make_token())
{
// my code here
}
它会按预期工作。但事实证明,如此简单的事情在 C++ 中却是困难的。
【问题讨论】:
-
我不认为你可以。
-
将返回值附加到标识符是告诉编译器不要立即销毁该值的方法。
-
我认为一个更好的问题是,你为什么不想将它分配给一个变量?如果您担心它会浪费,请不要担心。编译器很聪明,它们永远不会生成您编写的代码。只需将其分配给变量或 const ref 并且不再使用它就足以告诉编译器“我不会使用它,但析构函数不应该运行,直到它超出范围。”
-
你的推理没有任何意义。
-
如果在 C++ 中很难,那只是因为你拒绝使用标准的方法。 RAII 是 C++ 的自动资源清理机制,
using是 C# 的。你在这里拒绝使用 RAII,所以留下了......尴尬的黑客攻击。因为当 RAII 运行良好时,没有人取代它。
标签: c++ variables destructor object-lifetime