在C++中,有没有办法从返回类型为 string& 的函数中不返回任何内容?

In C++, is there a way to return nothing from a function which has a return type of string&?

本文关键字:函数 任何内 string 返回 有没有 C++ 返回类型      更新时间:2023-10-16

我正在尝试实现以下子程序。

string& sortAndMerge(string &u, int start, int end){
    if(end>=0){
        int mid=(start+end)/2;
        if(start<end){
            sortAndMerge(u,start,mid);
            sortAndMerge(u,mid+1,end);
            return merge(u,start,mid,end);
        }
    }
    return;
}

该函数被称为sortAndMerge(s,0,s.length()-1),这里s是一个字符串。由于第三个参数最终可能为负数,我需要子程序忽略这些情况。

我收到以下错误:-

return-statement with no value, in function returning ‘std::string& {aka std::basic_string<char>&}’ [-fpermissive].

我有两个问题
1) 有没有一种方法可以从一个返回类型为void的函数中不返回任何内容
2) 什么时候可以使用不带任何内容或NULL的return关键字。

1) 有没有一种方法可以从一个返回类型为void的函数中不返回任何内容。

没有。如果你想让你的程序正常工作,就不要。

2) 什么时候可以使用不带任何内容或NULL的return关键字。

只有在返回类型为void的函数中,才可以不带任何内容地使用return关键字。在任何以指针(而非引用)类型作为返回类型的函数中,都可以将return关键字与NULL一起使用。

根据NULL的定义,我想您也可以从以int为返回类型的函数中返回NULL,但只返回0更有意义。

不能这样做,因为将函数声明为
string& sortAndMerge(string &u, int start, int end)

您承诺函数调用方返回字符串引用。因此,所有调用方都期望并等待获得字符串引用。所以编译器不允许违背这样的承诺(规则)。

要么必须返回所承诺的内容,要么重新定义函数以返回其他数据类型。如果需要返回不同的东西,可以考虑EnumUnion或其他东西。除此之外,您可以trow异常退出函数而不返回任何信息。但是它不认为执行适当的功能。

您可以始终使用bool作为返回类型

bool do(int& tryInt, int s, int e)
{
  if(s>5 || e<0)
    return false;
  tryInt= s + e;
    return true;
}
int main()
{
  int tryInt = 0;
  int myInt = do(tryInt,6,4)? tryInt : 0;
}

编辑:对不起,我没有看到它是什么时候发布的:/

是C++17结构,std::可选,它可能包含一个值,但也可能不包含。有些情况下,它只是没有值,包括许多算法中的第一个循环迭代。您可以将is检查为布尔值,以验证是否存在该值。

但是std::optional不适用于引用。如果您真的需要通过引用返回字符串(比如说它很长),请使用std::stringview代替:

std::optional<std::stringview> sortAndMerge(std::stringview u, int start, int end)
 

std::stringview内部不包含字符串,只包含对它的引用,因此复制成本很低,而且您不再需要手动处理引用。它有许多类似于std::string提供的方法,所以你可以用它做类似的事情