C++ 从C++;
考虑以下代码段:C++ 从C++;,c++,return,void,C++,Return,Void,考虑以下代码段: void Foo() { // ... } void Bar() { return Foo(); } P>在C++中使用上述的理由是什么,而不是更常见的方法: void Foo() { // ... } void Bar() { Foo(); // no more expressions -- i.e., implicit return here } 我能想到的唯一原因是如果您有一长串returnfoo()语句,并希望使其更紧凑 这是一个毫无用处
void Foo()
{
// ...
}
void Bar()
{
return Foo();
}
<> P>在C++中使用上述的理由是什么,而不是更常见的方法:
void Foo()
{
// ...
}
void Bar()
{
Foo();
// no more expressions -- i.e., implicit return here
}
我能想到的唯一原因是如果您有一长串
returnfoo()代码>语句,并希望使其更紧凑 这是一个毫无用处的构造,除非与模板一起使用。也就是说,如果您定义了返回值可能为“void”的模板函数。在您的示例中可能没有用处,但在某些情况下,在模板代码中很难处理void
,我希望此规则有时会有所帮助。非常做作的例子:
#include <iostream>
template <typename T>
T retval() {
return T();
}
template <>
void retval() {
return;
}
template <>
int retval() {
return 23;
}
template <typename T>
T do_something() {
std::cout << "doing something\n";
}
template <typename T>
T do_something_and_return() {
do_something<T>();
return retval<T>();
}
int main() {
std::cout << do_something_and_return<int>() << "\n";
std::cout << do_something_and_return<void*>() << "\n";
do_something_and_return<void>();
}
#包括
模板
T retval(){
返回T();
}
模板
void retval(){
返回;
}
模板
int retval(){
返回23;
}
模板
不要做某事{
std::cout您可以在通用代码中使用它,其中Foo()的返回值未知或可能会更改。请考虑:
template<typename Foo, typename T> T Bar(Foo f) {
return f();
}
模板T条(Foo-f){
返回f();
}
在这种情况下,Bar对void有效,但如果返回类型更改,它也有效。但是,如果它仅调用f,那么如果T为非void,则此代码将中断。使用return f();语法可以保证保留Foo()的返回值(如果存在),并允许void()
此外,显式返回是一个好习惯。模板:
template <typename T, typename R>
R some_kind_of_wrapper(R (*func)(T), T t)
{
/* Do something interesting to t */
return func(t);
}
int func1(int i) { /* ... */ return i; }
void func2(const std::string& str) { /* ... */ }
int main()
{
int i = some_kind_of_wrapper(&func1, 42);
some_kind_of_wrapper(&func2, "Hello, World!");
return 0;
}
模板
R某种包装器(R(*func)(T),T)
{
/*做些有趣的事给t*/
返回函数(t);
}
int func1(int i){/*…*/return i;}
void func2(const std::string&str){/*…*/}
int main()
{
int i=某种包装器(&func1,42);
某种包装(func2,“你好,世界!”);
返回0;
}
在不能返回void的情况下,返回func(t)当模板中的
被要求包装func2
时,模板中的
不起作用,原因是像math一样返回内存。h总是返回。math.h没有空参数和空参数。在许多实际情况下,您需要内存。可能是Foo()
最初返回了一个值,但后来更改为void
,更新该值的人只是想得不太清楚。谢谢。所有答案都很好,但这一个很好地说明了这一点。那么它就不是“无用的”了,是吗?;)@jalf:好吧,从问题中显示的形式来看,它是非常无用的,不是吗?;-)足够正确。我将问题中的代码解释为语言功能的一个示例,并询问语言功能通常何时有用。但公平点是什么?数学函数接受参数和返回值,因为它们就是这样做的需要做的是数学函数。。。