Какой эффект оказывает const в начале объявления функции, не являющейся членом?
Покопавшись в 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 ответа
Это часть возвращаемого типа. Функции возвращаются 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);
).
Вы не можете изменить возвращенный объект
пример:
#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
}