2013-10-01 5 views
2

Это может быть легко, и я могу просто пропустить то, что прямо передо мной. Однако я не могу понять, как обеспечить, чтобы параметр функции, переданный по ссылке, можно было изменить. По существу, мне нужно следующее:Как проверить, является ли параметр функции постоянным?

bool calculate(double lat, double lon, double dep, 
       double &x, double &y, double &z) 
{ 
    if (x, y, AND z are NOT const) 
    { 
     perform the proper calculations 
     assign x, y, and z their new values 
     return true; 
    } 
    else //x, y, or z are const 
    { 
     return false; 
    } 
} 

«тогда» проверка Постулаты действительно все что мне нужно

Опять же прошу прощения, если это уже на этом сайте, или, если это стандартная функция библиотеки, что я не хватает прямо передо мной. Я приезжаю сюда все время и практически всегда получаю хороший ответ, но я ничего не мог найти по этому поводу уже здесь.

+2

Переменные не будут const, если они не объявлены как таковые в списке параметров. – 0x499602D2

+5

Вы не можете передать 'const double' функции, которая принимает' double & '. Вам не нужен чек. – jrok

+0

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

ответ

8

если у вас есть double &x, то это не постоянный. Если у вас есть const double &x, то это константа.

В вашем случае - нет необходимости проверять, они не являются константами. Проверка выполняется автоматически в компиляции времени.

Смотреть это:

void func(double &x){ X=3.14; } 

double d; 
const double c_d; 
func(d); // this is OK 
func(1.54); // this will give an ERROR in compilation 
func(c_d); // this will also give an ERROR in compilation 

Вы просто не можете вызвать функцию, которая хочет (не const) ссылки с константой.

Это означает, что компилятор находит некоторые ошибки для вас - как в вашем случае, вам не придется возвращать true или false, и вам не нужно, чтобы проверить его, чтобы попытаться найти ошибки - вы просто скомпилировать и компилятор найдет эти ошибки для вас.

+1

Конечно, кто-то мог использовать 'const_cast', чтобы лежать в функции, но нет возможности обнаружить это, поэтому им просто нужно будет жить с последствиями. –

+1

@MikeSeymour - правда. BTW - можете ли вы сделать 'const_cast' на таком количестве, как 1.54? – rabensky

+0

Нет, вы можете отличать * lvalue * (например, переменную) от ссылки * lvalue *. Литерал, подобный '1.54', является * rvalue *, поэтому он не будет работать. –

Смежные вопросы