У меня есть эта функция 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
изменяет твою спину.
Что происходит с
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
метод.
Вы не должны даже хочу звонить pass_by_non_const
от pass_by_const
потому что, если аргумент является константной ссылкой, вы «обещаете» не изменять его.
Если хотите нарушать система типов (что плохо), вы могли бы сделать такие уродливые вещи, как
pass_by_const(const std::string& s)
{
pass_by_non_const(const_cast<std::string&>(s));
}
Но дело в том, что это неправильно и может быть неопределенное поведение. Так что может случиться что-нибудь плохое (сбой или даже случайная программа, которая делает то, что вы хотите).
Если вы хотите подчиниться системе типов и избежать нарушения инвариантов, сделайте локальную копию, как предложено в ответ антимонопольного органа. Конечно, создание локальной копии может быть дорогостоящим.