以下功能定义是否合法?
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
这是否意味着它是非法的,如果不是其他的?你能提供使用它的例子吗? 你能给我一些明确的解释吗? 提前致谢
答案 0 :(得分:3)
定义很好。该函数可以返回对t1
或t2
之外的其他变量的引用。如果您尝试返回t1
或t2
,则编译器只会抱怨。
答案 1 :(得分:2)
为什么它应该是非法的?你的函数可以使用一些全局状态来返回,而禁止返回它的参数。
int& foo(const int& a, const int& b)
{
static int c = a + b;
return c;
}
<强> ADDED 强>
你不能退回你的一个论点,因为它会违反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)
这是合法的但不建议返回引用,因为引用通常是对局部变量。您通常会返回一个指向您拥有的对象的指针,然后调用者必须删除该项目。如果必须使用格式,则必须创建其中一个输入的本地克隆并返回该格式。