检查返回值是否被消耗
给定一个返回重构造和重销毁对象的函数,如果不消耗函数返回值,是否有办法跳过对象构造和销毁?
HeavyObject func();
auto res = func(); // heavy object is constructed and returned
func(); // lightweight "null" object is returned and immediately destroyed
除了标签调度之外,有没有我可以使用的技术void func(NotConsumed);?
更新
丢弃返回值是可以的,所以[[nodiscard]]不是一个选项。客户可以决定是否要使用结果。
让我们假设func()启动一些工作并HeavyObject充当某种句柄。如果客户愿意,他们可以稍后使用它来控制/监视作业。这种句柄的构造可能涉及例如创建管道或堆内存分配。
还有其他一些func()必须使用返回值的重载,它们被标记为[[nodiscard]]. 新的重载没有此要求,但必须与现有 API 兼容。
回答
从 C++17 开始就有这个nodiscard属性。但是,这只会有助于不要忽略返回值,并且只会鼓励编译器发出警告。
我不认为你想要什么有一个简单的答案(即没有第二个功能或重载)。也因为重对象的构造已经发生在函数内部,而不是在函数返回之后。
您可以做的是返回一个仅在需要时才构造重对象的代理。沿线的东西:
struct heavy_object { int x; };
struct proxy {
int parameter_needed_to_construct_heavy_object;
operator heavy_object() {
return {parameter_needed_to_construct_heavy_object};
}
};
proxy func() {
return {42};
}
int main() {
func(); // ok, no heavy object is constructed
heavy_object ho = func(); // ok, heavy object is constructed
auto x = func(); // "ok-ish", caller must be aware that x is just the proxy
}
代替隐式转换 aget()可以代替它,但这不会改变调用者必须做一些额外的事情才能获得实际返回值的事实。
话虽如此,我认为使用两个单独的函数或重载是更简单、更清晰的解决方案。