make_shared повышения берет в ссылке константы. Какой-либо способ обойти это?

Палитры расположены в Вашем профиле пользователя, в .config/libreoffice3/user/config/. Кроме того, существует ряд палитр в /opt/libreoffice3.5/presets/config/. Смотрите для файлов, заканчивающихся .soc - все те файлы являются палитрами. Я предполагаю, что необходимо будет восстановить standard.soc в профиле пользователя.

37
задан Craig H 3 September 2009 в 15:20
поделиться

6 ответов

http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/make_shared.html говорит: «Если вам нужно передать неконстантную ссылку на конструктор T, вы можете сделать это, заключив параметр в вызов boost :: ref. " Другой текст на этой странице, кажется, поддерживает ответ Рюдигера Ханке.

42
ответ дан 27 November 2019 в 04:50
поделиться

Не могу говорить за авторов функции, но ... вам нужно сделать выбор. Если бы функция использовала неконстантную ссылку, то вы не могли бы передавать константные объекты конструкторам, которые принимают константные ссылки.

По моему опыту, конструкторы, принимающие константные ссылки, гораздо более распространены, чем конструкторы, принимающие изменяемые ссылки.

Конструкторы могут иметь параметры n , поэтому вы не можете просто предоставить одну перегрузку, но должны учитывать любую комбинацию констант / неконстант, которая приводит к экспоненциальному взрыву перегрузок, которые вам понадобятся, если вы хотите предоставить перегрузки для всех из них. Я думаю, что C ++ 0x и идеальная пересылка должны решить эту проблему.

8
ответ дан 27 November 2019 в 04:50
поделиться

До тех пор, пока ссылки на rvalue (см. Раздел «Проблема пересылки») не поступят в C ++ 0x, идеальная пересылка практически невозможна. make_shared просто делает все, что в его силах, с тем, что ему дано.

4
ответ дан 27 November 2019 в 04:50
поделиться

Вам необходимо определить конструктор копирования.

class Object
{
  public:
    Object(const Object& original)
    {
        // Copy original to new object
        // The reason for the const is this should not change the original 
    };

    Object(int& i)
    {
      i = 2;
    }
};
1
ответ дан 27 November 2019 в 04:50
поделиться

Хотя я до сих пор не понимаю, почему boost make_shared требует этого ограничение на меня, я нашел способ обойти это. Если я передам константную ссылку на указатель параметра, я могу изменить указатель. Вот фрагмент кода:

class Object
{
  public:
    Object(int* const& i)
    {
      *i = 2;
    }
};


int main(int argc, char *argv[])
{
  int i = 0;
  boost::shared_ptr<Object> obj = boost::make_shared<Object>(&i);
  cout << i << "\n";
  return 1;
}

Этот работает как шарм. У кого-нибудь есть идеи, почему мне нужно прыгать через эти обручи? Кажется странным, что make_shared налагает на меня это ограничение, хотя я согласен, что в большинстве случаев это, вероятно, плохая идея.

0
ответ дан 27 November 2019 в 04:50
поделиться

Вы можете исправить это, сделав конструктор объекта явным .

0
ответ дан 27 November 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: