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

Какая разница между 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.


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

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

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

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

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

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

licensed under cc by-sa 3.0 with attribution.