非成员函数声明开头的 const 有什么作用?
What effect does const at the beginning of a non-member function declaration have?
通过 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;
}
其他一些使用不同 return 类型的测试表明,Visual Studio 和 g++ 都可以在没有警告的情况下像这样编译行,但 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
}
它是 return 类型的一部分。函数 return const string
和 const int
.
在 const int
的情况下,这与 int
相比确实没有区别,因为您可以使用 int
return 值做的唯一事情是将值复制到某处(事实上,标准明确表示 const
在这里无效)。
在 const string
的情况下,它确实有所不同,因为 class 类型的 return 值可以调用成员函数:
fourth().erase(1);
在 fourth()
return 是 const string
的情况下将无法编译,因为 erase()
不是 const
方法(它试图修改string
它被调用)。
就我个人而言,我从不将值returning 函数return 设为const
值,因为它不必要地限制了调用者(尽管有些人认为这有助于防止写入string s = fourth().erase(1);
).
通过 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;
}
其他一些使用不同 return 类型的测试表明,Visual Studio 和 g++ 都可以在没有警告的情况下像这样编译行,但 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
}
它是 return 类型的一部分。函数 return const string
和 const int
.
在 const int
的情况下,这与 int
相比确实没有区别,因为您可以使用 int
return 值做的唯一事情是将值复制到某处(事实上,标准明确表示 const
在这里无效)。
在 const string
的情况下,它确实有所不同,因为 class 类型的 return 值可以调用成员函数:
fourth().erase(1);
在 fourth()
return 是 const string
的情况下将无法编译,因为 erase()
不是 const
方法(它试图修改string
它被调用)。
就我个人而言,我从不将值returning 函数return 设为const
值,因为它不必要地限制了调用者(尽管有些人认为这有助于防止写入string s = fourth().erase(1);
).