Какой эффект оказывает 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
}
Другие вопросы по тегам