0

У меня есть эта функция pass_by_const(const std::string& s), которая хочет позвонить pass_by_non_const(std::string& s).C++ метод прохода-не-const-reference внутри метода pass-by-const-reference

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

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

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

+0

Если вы компилятор разрешает это без предупреждения, я бы получил новый компилятор. VC++ позволяет передавать temps как неконстантные ссылки, но даже это предупреждается с соответствующими (и, на мой взгляд, обязательными) уровнями предупреждения. – WhozCraig

+0

. я просто хочу найти работу. это просто удобный способ попросить разъяснений. – octoback

ответ

3

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

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

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

Однако локальная неконстантная копия 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 может быть изменен в самом внутренней области видимости, в то время как с от вмещающего объема не будет, что соблюдать Pass- by-const-refness метода 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)); 
} 

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

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

+0

Я не нарушаю корректность const в своей работе, и я все еще убеждаюсь, что 'pass_by_const' не изменяется, передается const ref argment. – octoback

+1

@antitrust «Я не нарушаю конституционную корректность» - ** вы делаете. ** – 2013-04-21 08:01:44

+0

нет: все уважают его обещание, pass by const ref метод никогда не будет разрешен и не сможет изменить аргумент, даже если вы вызываете пропуск не const. – octoback

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

  • Нет связанных вопросов^_^