-1

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

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

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

4

4 回答 4

3

定义很好。该函数可以返回对其他变量的引用,而不是t1or t2t1如果您尝试返回或,编译器只会抱怨t2

于 2012-09-21T16:58:37.393 回答
2

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

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

添加

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

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

如果可以在您的情况下返回非常量,则可以编写

foo(5, 4) = 3;

这没有任何意义。

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

于 2012-09-21T16:58:29.317 回答
1

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

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

如果您以这种方式更改它:

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

the code will be compiled with no errors. However, if outside of this function somewhere else you do:

GetMax(x,y) = 0;

the compiler would fail at this line because you are assigning value to a const (= the return value of the function).

于 2012-09-21T17:33:02.750 回答
-1

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

于 2012-09-21T16:58:27.553 回答