非成员函数声明开头的const有什么作用?

What effect does const at the beginning of a non-member function declaration have?

本文关键字:什么 作用 const 成员 函数 声明 开头      更新时间:2023-10-16

浏览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和c++在编译这样的行时都没有警告,但是const限定符似乎对我对结果的处理没有影响。谁能举个例子说明它在哪里重要?

不能修改返回的对象

的例子:

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

是返回类型的一部分。函数返回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);之类的东西是有用的)。