const在非成员函数声明开头有什么影响?

时间:2016-09-27 03:55:38

标签: c++ const function-declaration non-member-functions

通过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限定符似乎对我可以对结果做什么没有影响。任何人都可以提供一个重要的例子吗?

2 个答案:

答案 0 :(得分:2)

您无法修改返回的对象

示例:

#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
}

答案 1 :(得分:1)

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

const int的情况下,与int相比,这确实没有区别,因为你可以用int返回值做的唯一事情是将值复制到某处(在事实上,标准明确指出const在这里没有效果。)

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

fourth().erase(1);
如果fourth()返回const string

将无法编译,因为erase()不是const方法(它会尝试修改string它被称为。)

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