2013-08-19 5 views
0

У меня есть функция, как это:Передача зОго :: Карты в качестве параметра аргумента по умолчанию

int insert(std::string, std::string, std::map<std::string, std::string>&) 

, так как третий аргумент является ссылкой, что правильный способ дать параметр по умолчанию для этого аргумента?

Я хочу установить std::map<std::string, std::string>& = VAL по умолчанию и использовать карту, только если этот VAL не является значением по умолчанию.

+1

Интересно, зачем нужна карта по умолчанию для вставки? Вы можете вернуть ссылку на локальную карту «static» из некоторой функции и использовать ее как значение по умолчанию. – jrok

+0

, если на входе есть карта, я вставляю ее во входную карту. иначе я вставляю его в другую глобальную карту. –

+0

Если VAL - это уже существующая карта, это нормально. –

ответ

3

Rvalue не связывается с неконстантным временным.

Но если значение по умолчанию имеет смысл, возможно, вы его не модифицируете, и в этом случае сделайте его const, а std::map<std::string, std::string>() будет работать как значение по умолчанию просто отлично. I.e .:

int insert(std::string x, std::string y, 
      const std::map<std::string, std::string> &m = 
        std::map<std::string, std::string>()) 

Если вам действительно нужна ссылка не const, просто создайте перегруз с одним аргументом, который пройдет локальную переменную.

Комментарий к объявлению: Хорошо. Вы можете передать глобальную переменную в качестве аргумента по умолчанию. Просто

int insert(std::string x, std::string y, 
      std::map<std::string, std::string> &m = GLOBAL_map); 

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

+0

Мне нужно добавить данные на входную карту. –

+0

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

+0

@PrasanthMadhavan: просто используйте выражение, возвращающее карту по умолчанию в аргументе. Но я действительно думаю, что вы должны больше подумать об общем дизайне (возможно, задайте здесь более широкий вопрос). –

0

Если вы передаете неконстантную ссылку, это потому, что вы хотите, чтобы изменил ее и передаст ей значение lvalue. Из вашего текста, Я понимаю, что вы хотите изменить карту, но только условно. В этом случае стандартная идиома должна передать указатель, с nullptr (или NULL или для pre-C++ 11) в качестве аргумента по умолчанию , для которого вы ничего не делаете.