Почему не делает auto_ptr использования строительных работ = синтаксис

Существует конфликт между 3DMol jquery и блестящей JQuery.

Если вы запускаете скрипт nojquery, он работает:

теги $ head (теги $ script (src = "http://3Dmol.csb.pitt.edu/build/3Dmol-nojquery.js") )

9
задан Meysam 28 November 2012 в 05:42
поделиться

4 ответа

Это " явное "ключевое слово".

template <typename T>
struct foo
{
  explicit foo(T const *)
  {
  }
};


template <typename T>
struct bar
{
  bar(T const *)
  {
  }
};


int main(int argc, char **argv)
{
  int a;
  foo<int> f = &a; // doesn't work
  bar<int> b = &a; // works
}

"явное" Ключевое слово предотвращает использование конструктора для неявных преобразований типов. Рассмотрим следующие два прототипа функций:

void baz(foo<int> const &);
void quux(bar<int> const &);

Используя эти определения, попробуйте вызвать обе функции с указателем int:

baz(&a);  // fails
quux(&a); // succeeds

В случае quux ваш указатель int был неявно преобразован в столбец.

EDIT: Чтобы подробнее рассказать о комментариях других людей, рассмотрим следующий (довольно глупый) код:

void bar(std::auto_ptr<int>);


int main(int argc, char **argv)
{
  bar(new int()); // probably what you want.

  int a;
  bar(&a); // ouch. auto_ptr would try to delete a at the end of the
           // parameter's scope

  int * b = new int();
  bar(b);
  *b = 42; // more subtle version of the above.
}
17
ответ дан 4 December 2019 в 07:05
поделиться

Вам необходимо использовать

auto_ptr<Table> table = auto_ptr<Table>(db->query("select * from t"));

auto_ptr не определяет оператор присваивания для своего типа шаблона. Единственное допустимое назначение - из другого auto_ptr (и его конструктор из указателя является явным). Это сделано для защиты случайного неправильного использования auto_ptr, так как auto_ptr предполагает владение памятью.

Я предполагаю, что вам нужна форма назначения для использования нескольких запросов после другого, например:

// initialize using constructor
auto_ptr<Table> table(db->query("select * from t1"));
...
// new query using assignment
table = auto_ptr<Table>(db->query("select * from t2"));
...
// another query using assignment
table = auto_ptr<Table>(db->query("select * from t3"));
8
ответ дан 4 December 2019 в 07:05
поделиться

Конструктор объявлен как явный, что означает, что он не будет использоваться для неявного преобразования типов. Неявное преобразование в auto_ptr может легко привести к нежелательным ситуациям, поскольку auto_ptr становится владельцем указателя.

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

void fun(std::auto_ptr<Foo> foo) // Assume implicit conversion is allowed.
{
    // do stuff with foo
}

Foo *foo = new Foo();

f(foo); // Normally this isn't allowed.

foo->bar(); // Oops
5
ответ дан 4 December 2019 в 07:05
поделиться

Добавление к сказанному Лотаром: поскольку конструктор auto_ptr объявлен с явным выражением Ключевое слово , вам нужно использовать явное приведение, чтобы создать auto_ptr из необработанного указателя. (До введения явного неявное приведение было проклятием многих новых и опытных разработчиков C ++.)

2
ответ дан 4 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

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