是“const参数和非成本返回声明”可能吗?

时间:2012-09-21 16:55:13

标签: c++ const

以下功能定义是否合法?

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

写道: “在return语句中,编译器会抱怨t1或t2不能转换为非const。” 我在这个网站上看到了它:http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

<强> ADDED

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

  • 按值从功能返回
  • 使用非const参数类型

如果你的案例中可以返回非const,那么可以写

foo(5, 4) = 3;

没有任何意义。

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

答案 2 :(得分:1)

非法编译器会显示错误消息

原因是函数返回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赋值(=函数的返回值)。

答案 3 :(得分:-1)

这是合法的但不建议返回引用,因为引用通常是对局部变量。您通常会返回一个指向您拥有的对象的指针,然后调用者必须删除该项目。如果必须使用格式,则必须创建其中一个输入的本地克隆并返回该格式。