Android - читать PDF и отображать его с помощью Intent

Определение для конструктора преобразования отличается от C ++ 03 и C ++ 11. В обоих случаях он должен быть конструктором не explicit (иначе он не будет задействован в неявных преобразованиях), но для C ++ 03 он также должен быть вызван с помощью одного аргумента. То есть:

struct foo
{
  foo(int x);              // 1
  foo(char* s, int x = 0); // 2
  foo(float f, int x);     // 3
  explicit foo(char x);    // 4
};

Конструкторы 1 и 2 оба являются конструкторами преобразования в C ++ 03 и C ++ 11. Конструктор 3, который должен принимать два аргумента, является только конструктором преобразования в C ++ 11. Последний конструктор 4 не является конструктором преобразования, потому что он explicit.

  • C ++ 03: §12.3.1 Конструктор, объявленный без спецификатора функции explicit, который может быть вызван одним параметром, указывает преобразование из типа его первого параметра в тип его класса. Такой конструктор называется конструктором преобразования.
  • C ++ 11: §12.3.1 Конструктор, объявленный без спецификатора функции explicit, указывает преобразование из типов его параметров в тип своего класса. Такой конструктор называется конструктором преобразования.

Почему конструкторы с более чем одним параметром считаются преобразователями в C ++ 11? Это связано с тем, что новый стандарт предоставляет нам удобный синтаксис для передачи аргументов и возврата значений с помощью braced-init-lists . Рассмотрим следующий пример:

foo bar(foo f)
{
  return {1.0f, 5};
}

Способность указывать возвращаемое значение как braced-init-list считается преобразованием. Для этого используется конструктор преобразования для foo, который принимает float и int. Кроме того, эту функцию можно вызвать, выполнив bar({2.5f, 10}). Это также конверсия. Поскольку они являются преобразованиями, для конструкторов, которые они используют, являются конструкторами преобразования .

. Важно отметить, что, делая конструктор foo, который принимает a float и int имеют спецификатор функции explicit, чтобы остановить компиляцию вышеуказанного кода. Вышеупомянутый новый синтаксис может использоваться только в том случае, если для выполнения задания имеется конструктор преобразования.

  • C ++ 11: §6.6.3: инструкция return с braced-init-list инициализирует объект или ссылку, которая должна быть возвращена из функции путем инициализации-list-initialization (8.5.4) из указанного списка инициализаторов. §8.5: Инициализация, возникающая [...] при передаче аргументов [...], называется копией-инициализацией. §12.3.1: Явный конструктор строит объекты так же, как и неявные конструкторы, но делает это только там, где явно используется синтаксис прямой инициализации (8.5) или где используются броски (5.2.9, 5.4).
0
задан Mitesh Shah 30 January 2014 в 09:30
поделиться