Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在灵长类c+中,返回常量和非常量有什么区别+;_C++_Return_Constants - Fatal编程技术网

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问题无关。