非成员函数声明开头的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;
}
其他几个带有不同返回类型的测试表明,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 string
和const int
在const int
的情况下,这与int
相比确实没有什么区别,因为您对int
返回值所能做的唯一事情就是将该值复制到某个地方(实际上,标准明确表示const
在这里没有作用)。
在const string
的情况下,它确实有区别,因为类类型的返回值可以被调用成员函数:
fourth().erase(1);
如果fourth()
返回const string
, 将无法编译,因为erase()
不是const
方法(它试图修改调用它的string
)。
就我个人而言,我从不让返回值的函数返回const
值,因为它不必要地限制了调用者(尽管有些人认为防止编写string s = fourth().erase(1);
之类的东西是有用的)。
相关文章:
- archive_read_support_filter_all() 有什么作用?
- 当我们为(;;) 写作时,它做了什么?for 循环中的双分号有什么作用?
- 这个递归函数有什么作用?运行时的复杂性是多少?
- DrawShadow 中的 Elevation 究竟有什么作用?
- 测试"stream >> char"有什么作用?
- "uFlags &= ~CHN_PANNING"命令有什么作用?
- GCC 的 -Wpsabi 选项究竟有什么作用?压制它意味着什么?
- int** a = new int*[n]();这个函数有什么作用?
- C++ 此函数调用之前的(void)有什么作用?
- i+=(i&-i) 有什么作用?它是便携式的吗?
- 这个size_t在 lambda 中有什么作用?C++代码
- 数组下标运算符 ([ ]) 对数组有什么作用?
- 结构之外的节点 * head 有什么作用?
- 重载括号运算符有什么作用?
- clang的"-Ofast"选项在实践中有什么作用,特别是对于与gcc的任何差异?
- std::make_unique_for_overwrite() 对 std::make_unique() 有什么作用?
- 运算符 delete[] 有什么作用?
- 下面的代码有什么作用?c++
- 这个陈述'p = I.ptr<uchar>(i);有什么作用?
- 这个嵌套的名称空间定义有什么作用