Есть ли способ объявить, что входной параметр функции должен быть константной ссылкой? - PullRequest
0 голосов
/ 01 февраля 2012

мотивация для этого заключается в том, что (редко) мне нужно знать, что входной параметр конструктора класса или функции в целом является const.Обычно, когда класс является помощником, который «автоматизирует» некоторую процедуру.
Пример:
Является ли это нормальным способом получения случайного элемента из контейнера?
Если вы посмотрите наПо коду ясно, что если контейнер, переданный в конструктор, изменяется, функциональность класса нарушается.Так есть ли способ иметь функцию «спрос» const вместо «обещание» const.

Пример:

int f(const vector<int>& v)
{
    return v.size();
}
int main()
{
    vector<int> v;
    v.push_back(42); // can f be changed to reject v because it is not const 
    cout << f(v);

}

Ответы [ 5 ]

5 голосов
/ 01 февраля 2012

Объявите, но не реализуйте неконстантную версию.

int f(vector<int>& v);

Попытки передать неконстантный вектор будут разрешены этой функцией, и затем вы получите ошибку компоновщика, потому что такой функции не существует.

Некоторые необычные игры-шаблоны могут превратить это в ошибку во время компиляции.

2 голосов
/ 01 февраля 2012

Нет способа гарантировать это.Если вы хотите быть уверены, что объект не изменяется, он должен принадлежать классу.Один из способов сделать это - скопировать объект, который вы хотите сохранить постоянным, в класс или, если вы используете C ++ 11, чтобы позволить конструктору взять ссылку на rvalue и переместить объект.

0 голосов
/ 01 февраля 2012

Вы можете сделать это, перегрузив функцию для неконстантной ссылки.

Следующий пример демонстрирует это.Однако вместо возврата -1 первая версия f должна выдать исключение.

#include <vector>
#include <iostream>

int f(std::vector<int>& )
{
    return -1;
}
int f(const std::vector<int>& v)
{
    return v.size();
}
int main()
{
    std::vector<int> v;
    v.push_back(42); // can f be changed to reject v because it is not const
    std::cout << f(v)<<std::endl;

    const std::vector<int> cv(5);
    std::cout << f(cv)<<std::endl;
}
0 голосов
/ 01 февраля 2012

Не думаю, что это возможно.

Если бы это было возможно, вы все равно могли бы сделать это

Object mutable_;
const Object & notMutavle = mutable_;
func(notMutable);
mutable.change();

В любом случае, даже const состояние объекта может быть изменено, если у него есть mutable feilds.

Если вы хотите быть уверены, что никто не меняет ваш объект, вы должны сами управлять им.

0 голосов
/ 01 февраля 2012

Если вы хотите, чтобы некоторые атрибуты внутри класса были защищены от любых внешних изменений, они должны быть скопированы конструктором в атрибут const TypeName _attr;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...