[英]C++: return the return value of a void function from a void function
我有几个void函数(让它们分别称为foo和bar),它们共享相同的void函数清理功能,如果它们弄乱了,则清理它们:
#include <iostream>
void cleanup() { std::cout << "doing cleanup" << std::endl; }
void foo(int & i) {
if(i == 0) { return cleanup(); }
--i;
if(i == 0) { return cleanup(); }
++i;
}
void bar(int & i) {
if(i == 0) { return cleanup(); }
++i;
if(i == 0) { return cleanup(); }
--i;
}
int main() {
int i = 0;
foo(i);
bar(i);
return 0;
}
cpp.sh会愉快地编译并运行代码。
感谢这个问题的答案,我知道我可以返回void类型的对象。 但是我不知道它是否适用于返回void返回值。
您认为代码是否符合标准?
您是否愿意返回伪整数以使代码更具可读性? 还是无用的返回值会使代码更难阅读?
编辑:我觉得我需要添加一些澄清,为什么例如'cleanup(); 返回;' 不是解决方案。 实际的代码比示例更复杂,并且取决于我离开函数的位置,在cleanup()调用之后还会发生其他事情。 “返回cleanup();” 只是一种方便的方式,在我可以/必须立即离开的情况下,不将所有东西放在有条件的情况下。
第2段
return语句的expr-or-braced-init-list称为其操作数。 没有操作数的return语句只能在返回类型为cv void,构造函数(12.1)或析构函数(12.4)的函数中使用。 操作数类型为void的return语句只能在返回类型为cv void的函数中使用。 带有任何其他操作数的return语句只能在返回类型不是cv void的函数中使用; return语句将初始化对象或引用,该对象或引用将通过操作数的副本初始化(8.5)返回。
问题:
但是我不知道它是否适用于返回void返回值。
是的,从返回void的函数返回void表达式是完全有效的。 这在模板化代码中变得非常方便,因此您不必使用特殊情况的void函数。
您认为代码是否符合标准?
是的,一点没错。
您是否愿意返回伪整数以使代码更具可读性? 还是无用的返回值会使代码更难阅读?
这完全取决于您和您的美学。 它会使代码对您来说更具可读性(或者您有需要遵循的编码准则)。 我个人不会返回伪值(因为用户可能期望它们有一些含义)。
这对于完美转发很有用。 想象一下,您有一个类型为(模板参数)的函子,因此返回类型可能是任何东西。 拥有返回void
类型值的权限,您可以调用仿函数并将其返回值公开给调用者,而无需为无返回值的情况编写单独的代码。
template<typename Functor, typename... Args>
auto forward(Functor what_to_call, Args... args) -> decltype(what_to_call(std::forward<Args>(args)...))
{
return what_to_call(std::forward<Args>(args)...);
}
那已经很混乱了,但是如果不是要使用return
关键字传播void返回类型的能力,则需要两个由enable_if
控制的变体。
template<typename Functor, typename... Args>
auto forward(Functor what_to_call, Args... args) -> enable_if<is_same_type<decltype(what_to_call(std::forward<Args>(args)...)), void>::value, void>::type
{
what_to_call(std::forward<Args>(args)...);
return;
}
template<typename Functor, typename... Args>
auto forward(Functor what_to_call, Args... args) -> enable_if<!is_same_type<decltype(what_to_call(std::forward<Args>(args)...)), void>::value, decltype(what_to_call(std::forward<Args>(args)...))>::type
{
return what_to_call(std::forward<Args>(args)...);
}
因此, return function_returning_void();
设计用于有用的特殊情况。 不必仅仅因为可能就必须返回void
类型或其他任何类型的虚拟对象。 例如,不要return void();
或return -1;
简单return;
会做。
您认为代码是否符合标准?
是的,它确实。 在返回功能void
,你可以,如果表达式的类型是使用表达式return语句中void
。 如果是对也返回void
的函数的调用,则为后者。
您是否愿意返回伪整数以使代码更具可读性? 还是无用的返回值会使代码更难阅读?
我认为虚拟整数不会使代码更具可读性。 程序员期望返回值有意义。
我认为更具可读性的是将函数调用和返回语句分开:
cleanup();
return;
尽管我承认,但这完全是见解。
如果一个函数不返回任何值,那么检查该函数是否成功完成了它必须做的事情将更为明智。 一个小例子:
bool foo()
{
if (DoSomeThing() == true)
{
return true;
}
else
{
return false;
}
然后,您可以返回foo()的返回值:
if (!foo())
{
Console.WriteLine("foo returned false!");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.