ошибки компилятора — C ++ метод передачи по неконстантной ссылке внутри метода передачи по константной ссылке

У меня есть эта функция pass_by_const(const std::string& s) который хочет позвонить pass_by_non_const(std::string& s),

Если у меня есть определение этого метода

pass_by_const(const std::string& s)
{
pass_by_non_const(s);
}

компилятор даст на меня, и есть ли обходные пути? Боюсь что pass_by_non_const изменяет твою спину.

0

Решение

Что происходит с

pass_by_const(const std::string& s)
{
pass_by_non_const(s);
}

является: pass_by_const имеет постоянный аргумент std::string s, поэтому не разрешается изменять строку s, определенную в прилагаемой области видимости и переданную ему в качестве аргумента. Тем не мение, pass_by_non_const разрешено изменять с. Это вызывает ошибку компиляции во время компиляции.

Локальная неконстантная копия s может быть передана pass_by_non_const тем не мение. Затем локальная копия может быть изменена в объеме pass_by_non_constв то время как окружающая область видимости передана в качестве аргумента pass_by_const не изменен.

Правильный способ написать метод тогда

pass_by_const(const std::string& s)
{
std::string local_copy = s;
pass_by_non_const(local_copy );
}

Больше нет ошибки времени компиляции, local_copy может быть изменен в большинстве внутренних областей, тогда как s из внешней области видимости не будет, что соответствует передаче by-const-ref-ness pass_by_const метод.

3

Другие решения

Вы не должны даже хочу звонить pass_by_non_const от pass_by_const потому что, если аргумент является константной ссылкой, вы «обещаете» не изменять его.

Если хотите нарушать система типов (что плохо), вы могли бы сделать такие уродливые вещи, как

 pass_by_const(const std::string& s)
{
pass_by_non_const(const_cast<std::string&>(s));
}

Но дело в том, что это неправильно и может быть неопределенное поведение. Так что может случиться что-нибудь плохое (сбой или даже случайная программа, которая делает то, что вы хотите).

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

3