C++ 在灵长类c+中,返回常量和非常量有什么区别+;
我试图理解在返回函数时添加常量或忽略常量会有什么不同。让我通过一个例子来解释我的问题C++ 在灵长类c+中,返回常量和非常量有什么区别+;,c++,return,constants,C++,Return,Constants,我试图理解在返回函数时添加常量或忽略常量会有什么不同。让我通过一个例子来解释我的问题 const int foo() { return 3; } int main() { int check; check=foo(); cout<<"before:"<<check<<endl; check=1; cout<<"after:"<<check<<endl; return
const int foo()
{
return 3;
}
int main()
{
int check;
check=foo();
cout<<"before:"<<check<<endl;
check=1;
cout<<"after:"<<check<<endl;
return 0;
}
const int foo()
{
返回3;
}
int main()
{
整数检查;
check=foo();
cout区别在于以下编译器警告:
warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
const int foo()
^
看
这类内容被忽略,因此没有任何效果。区别在于编译器警告:
warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
const int foo()
^
看
这类内容被忽略,因此没有任何效果。您不是在更改变量,而是在更改它的副本
check=foo();
将foo
返回的值赋给check
check
不是const
您没有更改变量。您正在更改它的副本
check=foo();
将foo
返回的值赋给check
check
不是const
原语返回类型上的const
修饰符将被忽略
另请参见此问题:原语返回类型上的const
修饰符将被忽略
另请参见此问题:当您尝试返回引用时,它将起作用
例如:
int gGlobal;
const int & func()
{
return gGlobal;
}
int main ()
{
//Following statement will give error.
func() = 3;
return 0;
}
当你试图返回一个引用时,这会有所不同
例如:
int gGlobal;
const int & func()
{
return gGlobal;
}
int main ()
{
//Following statement will give error.
func() = 3;
return 0;
}
以前建议这样做,以避免意外地将指定给返回的临时对象:foo()=10;//编译失败
。现在建议不要这样做,因为它会禁止移动语义(也就是说,这意味着您必须将整个返回的临时变量复制到某个局部变量中,而不是将其窃取。这并不是说在原语情况下会有什么不同,但一般来说是好的)。在您的情况下,check
是非const
,只是被赋予了与foo
返回的const
临时值相同的值。对于“可能”的严格定义,它是一个精确的重复。过去建议这样做,以避免意外地分配给返回的临时值:foo()=10;//编译失败
。现在建议不要这样做,因为它会禁止移动语义(即,这意味着您必须将整个返回的临时变量复制到某个局部变量中,而不是将其窃取。这并不是说它在原语情况下有什么区别,而是作为一般规则,它是好的)。在您的情况下,check
是非const
,并且只被赋予与foo
返回的const
临时值相同的值。对于“可能”的严格定义,可能重复-这是一个完全重复。区别在于警告…非常糟糕的描述。你应该说为什么会抛出警告…@Zaibis如果你真的阅读了警告,它会告诉你为什么。所以无论如何你应该提到它,发生这种情况的原因是什么。@Zaibis所以我应该解释编译器为什么遵循标准?基本类型上的限定符I它被忽略了。没有更多的内容……不,但你可以补充说这是标准的一部分,或者说必须是这样,因为我敢打赌,有人问OP这样的问题,这不符合标准,所以这会帮助一些人;)区别在于警告…非常糟糕的描述。你应该说为什么会抛出警告…@Zaibis如果你真的阅读了警告,它会告诉你为什么。所以无论如何,你应该提到它发生这种情况的原因是什么。@Zaibis所以我应该解释编译器为什么遵循标准?基本类型上的限定符被忽略了。没有更重要的是……不,但你可以补充说,这是标准的一部分,或者说必须是这样,因为我敢打赌,有人问像OP这样的问题,并不符合标准,所以这会帮助一些人;)这是完全不同的事情。@jrok:当然不是,他是对的。@DídacPérez他是对的,但它是对的与OP问题无关。那是完全不同的事情。@jrok:当然不是,他是对的。@DídacPérez他是对的,但与OP问题无关。