Как вызвать неконстантную перегрузку?

Какая разница между void func(const int& i) и void func(int& i). Если const отключен на верхнем уровне, можно ли даже вызвать вторую перегрузку? Почему предпочтительны перегрузки const? Следующее всегда будет выбирать первую перегрузку:

func(42);
func(int{42});
int i = 42;
func(i);
int &j = i;
func(j);
func(i + 1);

Ой, я вижу, что моя проблема сейчас. Я набрал cout << "const\n" в обеих функциях, поэтому он выглядел так, будто он всегда вызывал первую перегрузку. Извините ребята.

2 ответа

const - это намек на себя и других разработчиков, что вы не собираетесь изменять наблюдаемый объект. Перегрузка const выбирается, если аргумент const:

#include <iostream>

void f(const int&)
{
 std::cout << "f(const int&)\n";
}

void f(int&)
{
 std::cout << "f(int&)\n";
}

int main()
{
 int a = 0;
 const int b = 0;
 int& c = a;
 const int& d = a;
 f(a);
 f(b);
 f(c);
 f(d);
}
</iostream>

Это приведет к выводу

f(int&)
f(const int&)
f(int&)
f(const int&)

См. Эту демонстрацию.

Как вы можете видеть, это не всегда перегрузка const.


Какая разница между void func(const int& i) и void func(int& i).

Разница между функцией void func(const int& i) и void func(int& i) заключается в том, что вы не можете изменить i в первой функции, а во втором.

можно ли даже вызвать вторую перегрузку?

Вторая функция будет выбрана, если аргумент не const.

Почему предпочтительны перегрузки const?

Это зависит. Вы не можете использовать const если вы планируете изменить его значение. И вы должны использовать const когда хотите быть уверенным, чтобы не менять переменную случайно или намеренно. Отметьте это сообщение: Используйте константу, где это возможно, в C++? для получения дополнительной информации.

licensed under cc by-sa 3.0 with attribution.