-2

通过 MSDN 挖掘,我遇到了另一条奇怪的线路:

// This function returns the constant string "fourth".
const string fourth() { return string("fourth"); }

完整的示例埋在这里:https : //msdn.microsoft.com/en-us/library/dd293668.aspx 精炼到最低限度,它看起来像这样:

#include <iostream>

const int f() { return 0; }

int main() {
    std::cout << f() << std::endl;

    return 0;
}

其他一些具有不同返回类型的测试表明,Visual Studio 和 g++ 都在没有警告的情况下编译这样的行,但 const 限定符似乎对我可以对结果执行的操作没有影响。任何人都可以提供一个重要的例子吗?

4

2 回答 2

3

您不能修改返回的对象

例子:

#include <string>
using namespace std;

const string foo(){return "123";}
string bar(){return "123";}

int main(){
    //foo().append("123"); //fail
    bar().append("123"); //fine
}

这与 const 变量几乎相同

#include <string>
using namespace std;

const string foo = "123";
string bar = "123";

int main(){
    //foo.append("123"); //fail
    bar.append("123"); //fine
}
于 2016-09-27T04:01:16.517 回答
1

它是返回类型的一部分。函数返回const stringconst int

在 的情况下const int,与 相比,这确实没有什么区别int,因为您可以对int返回值做的唯一事情就是将值复制到某处(事实上,标准明确表示const此处没有效果)。

在 的情况下const string,它确实有所不同,因为类类型的返回值可以调用成员函数:

fourth().erase(1);

fourth()在返回 a的情况下将无法编译const string,因为erase()它不是一个const方法(它试图修改string它被调用的)。

就我个人而言,我从不让返回值的函数返回一个const值,因为它不必要地约束了调用者(尽管有些人认为阻止编写类似的东西很有用string s = fourth().erase(1);)。

于 2016-09-27T04:02:53.987 回答