У меня есть код:Перегрузка на const и volatile - почему она работает по ссылке?
#include "stdafx.h"
#include <iostream>
using namespace std;
void func(const int& a)
{
std::cout << "func(const)" << std::endl;
}
void func(volatile int& a)
{
std::cout << "func(volatile)" << std::endl;
}
void func(const volatile int& a)
{
std::cout << "func(const volatile)" << std::endl;
}
int main()
{
const int a = 0;
const volatile int b = 0;
volatile int c = 0;
func(a);
func(b);
func(c);
system("pause");
return 0;
}
Приведенный выше код показывает перегрузки в зависимости от того являются Const/летучее параметры. Однако, если бы мне пришлось изменять параметры от int&
до int
, код больше не компилируется, и я не могу перегружать на основе типов параметров const/volatile. Я не понимаю, почему мы можем перегружать на основе const и volatile, если int передается по ссылке, но не в том случае, если он передан по значению?
EDIT Я должен подчеркнуть, что я понимаю, что такое ссылка. Я не понимаю, почему ссылочный псевдоним разрешен для перегрузки по const, но нормальный int не является.
Не могли бы вы рассказать о различии между int & и int? Я думал, что ссылка является просто псевдонимом для другой переменной? Итак, int & и int ничем не отличаются? Один просто означает псевдоним? – user997112
@ user997112 Когда вы используете ссылки, копия не производится. Когда вы используете простой pass-by-value, аргумент копируется. –
@ user997112 Я попытался уточнить.В ссылочном случае семантика радикально отличается. Для языка полезно иметь отдельные перегрузки. Не иметь их сбивать с толку. – juanchopanza