【问题标题】:is "const arguments and non-cost return statement " possible?“const arguments and non-cost return statement”可能吗?
【发布时间】:2024-01-19 22:28:01
【问题描述】:

下面的函数定义是否合法?

T& GetMax(const T& t1, const T& t2)
{
    if (t1 > t2)
    {
        return t2;
    }
    // else 
    return t2;
}

上面写着: “在返回语句中,编译器会抱怨 t1 或 t2 无法转换为非常量。” 我在这个网站上读到它:http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1

这是否意味着它是非法的,如果不是还有什么?你能提供使用它的例子吗? 你能给我一些明确的解释吗? 提前致谢

【问题讨论】:

  • 那么,你的意思是要返回t1还是t2?您是否尝试过实现并编译它?您看到的错误是什么?
  • 下面的函数定义是否合法?这取决于你在函数中做什么。 写的是...写的是在哪里?一些上下文会很好。
  • "下面的函数定义是否合法?" 不,它的点太多了。说真的,如果编译器抱怨 return 语句,向我们展示 return 语句。有关更多指南,请参阅 SSCCE.ORG
  • 我也认为是合法的。但我在我说的网址中读到了它。文章的作者没有提到身体的功能。他没有说函数返回 t1 还是 t2 或其他东西。他只说“在返回语句中,编译器会抱怨 t1 或 t2 不能转换为非常量。”所以我很困惑。
  • @user1308990 你真的读过这篇文章吗?我引用:“你应该注意到了,我没有在传递的两个参数中添加 const。这是必需的;因为函数返回 T 类型的非 const 引用”

标签: c++ constants


【解决方案1】:

定义很好。该函数可以返回对t1t2 之外的其他变量的引用。只有当您尝试返回 t1t2 时,编译器才会抱怨。

【讨论】:

  • 将函数主体添加到问题中
【解决方案2】:

为什么它应该是非法的?您的函数可以使用一些全局状态来返回,但禁止返回其参数。

int& foo(const int& a, const int& b)
{
    static int c = a + b;
    return c;
}

添加

你不能返回你的论点之一,因为它会违反const 约束。你可以

  • 按值从函数返回
  • 使用非常量参数类型

如果在你的情况下返回非常量是可能的,你可以写

foo(5, 4) = 3;

这毫无意义。

你也不能返回对一些在函数内部创建的临时自动变量的引用,因为它会在函数完成时被销毁。

【讨论】:

  • 将函数主体添加到问题中
  • 这是一个如何在代码中引入错误的好主意。我不认为该功能按预期工作,尽管是合法的。使用不同的参数调用它两次并将结果分配给两个不同的变量。我不明白为什么这是赞成票,而建议避免这种结构的答案反对票。
  • @luk32,这只是可能性的说明。最小的例子。例如,所有operator= 成员函数都接受常量引用并返回非常量引用。虽然被否决的问题建议向本地返回一个参考,这实际上是基本建议。
  • @lol 好吧,我看到问题有所改变。不过,正如我所说,这是合法的。好的。但想出好榜样并不容易。在我看来,您建议您可以编写一个函数在其中实例化一个变量并作为参考返回。 int x=foo(1,2); int y=foo(2,3); 不会产生 x=2 和 y=5。而且我不是在谈论被否决的问题,而是在谈论@Lukos 的回答,我觉得这很好。返回对局部变量的引用总是一个坏主意。 static 并没有太大帮助。事实上int c = a + b; 也会编译。 `
  • @luk32,Lukos 声明:'如果你必须使用你的格式,你必须创建一个输入的本地克隆,然后返回它'。它不是返回对局部变量的引用吗?使用指针的第二个建议似乎也不好。
【解决方案3】:

这是非法编译器会给出错误信息

原因是函数返回一个const,这与它对返回值的定义相反;即因为返回值尚未定义为const。但是,有问题的不是签名;问题出在 return 语句中,这就是编译器在 return 语句中给出错误的原因。

如果你以这种方式改变它:

const T& GetMax(const T& t1, const T& t2)
{
    if (t1 > t2)
    {
        return t2;
    }
    // else 
    return t2;
}

代码将被编译,没有错误。但是,如果您在此功能之外的其他地方执行以下操作:

GetMax(x,y) = 0;

编译器将在这一行失败,因为您将值分配给 const(= 函数的返回值)。

【讨论】:

    【解决方案4】:

    返回引用是合法的,但不建议返回,因为引用通常是局部变量。您通常会返回一个指向您已“新建”的对象的指针,但随后调用者将不得不删除该项目。如果您必须使用您的格式,则必须创建一个输入的本地克隆并返回它。

    【讨论】: