Вы можете сделать это сегодня на Java с помощью Red5 медиасервера от Flash. Если вы также хотите декодировать и кодировать видео в Java, вы можете использовать проект Xuggler .
Правила для этого приведены в §8.5.3 / 5 стандарта. Выделяют три основные ситуации. В первом случае инициализатор (в вашем случае «3») является либо lvalue, либо имеет тип класса. Поскольку ни одно из них не соответствует действительности, у вас есть третий случай: инициализация ссылки на константу с помощью rvalue, не имеющего типа класса. Этот случай охватывается последним пунктом в 8.5.3 / 5:
В противном случае временный объект типа «cv1 T1» создается и инициализируется из выражения инициализатора с использованием правил для инициализации не ссылочной копии (8.5). Затем ссылка привязывается к временному. Если T1 связан со ссылкой на T2, cv1 должен быть таким же cv-qualification, что и cv2, или более высоким, чем cv2; в противном случае программа имеет неверный формат.
Edit: перечитываю, я думаю, что IBM права. Раньше я думал о возможности копирования временного, но это не источник проблемы. Чтобы создать временное, используя инициализацию не ссылочной копии, как указано в §8.5, ему нужен ctor копирования. В частности, на данный момент это эквивалентно выражению вроде:
T x = a;
Это в основном эквивалентно:
T x = T (a);
Т.е. требуется создать временный, затем скопируйте временный объект в инициализируемый объект (который в данном случае является также временным). Подводя итог необходимому процессу, он примерно эквивалентен коду вроде:
T temp1(3);
T temp2(temp1); // requires copy ctor
show(temp2); // show's reference parameter binds directly to temp2
Мне кажется, что ответ Джерри верен, но есть еще несколько вопросов.
Интересно то, что существует основная проблема, касающаяся предыдущего параграф этого раздела ( 391 ). Эта проблема связана с аргументом одного и того же типа класса. В частности:
int main () {
show ( Thing (3) ); // not allowed under current wording
// but allowed with Core Issue 391
show ( 3 ); // Still illegal with 391
}
Изменение основной проблемы 391 влияет только на то, где временное значение rvalue имеет тот же тип класса. Предыдущая формулировка была:
Если выражение инициализатора является rvalue, где T2 - тип класса, и
cv1 T1
совместим по ссылке сcv2 T2,
ссылка привязана как следующее:[...]
Конструктор, который будет использоваться для создания копии, должен быть вызываемым независимо от того, действительно ли копия сделана.
Эта последняя строка заставит показать (Thing ( 3))
незаконно согласно текущему стандарту. Предлагаемая формулировка для этого раздела:
Если выражение инициализатора является rvalue, с T2 типом класса, и «cv1 T1» совместим по ссылке с «cv2 T2», ссылка привязана к объекту, представленному rvalue (см. 3.10 [basic.lval]) или подобъекту внутри этого объекта.
На этом этапе я подумал, что g ++, возможно, обновил свое поведение в соответствии с 391 , но это изменение произошло случайно включен случай копирования-инициализации. Однако этого не демонстрируют версии g ++, которые я тестировал:
class A{
public:
A ();
A (int);
private:
A (A const &);
};
void foo (A const &);
void foo ()
{
A a = 3 ; // 3.2.3 (ERROR), 3.4.6(ERROR), 4.4.0(ERROR), Comeau(ERROR)
foo ( 3 ) ; // 3.2.3 (OK), 3.4.6(OK), 4.4.0(OK), Comeau(OK)
foo ( A() ); // 3.2.3 (OK), 3.4.6(ERROR), 4.4.0(OK), Comeau(OK)
foo ( A(3) ); // 3.2.3 (OK), 3.4.6(ERROR), 4.4.0(OK), Comeau(OK)
}
Я не могу найти ошибку в Джерри '
Что произойдет, если вы попытаетесь присвоить временному объекту имя?
Thing temp (3 );
show (temp);
C ++ позволяет достаточно умным компиляторам избегать копирования временных объектов - единственного нарушения правила as-if , разрешенного стандартом. Я не знаком с компилятором IBM AIX C ++, но похоже, что он считает, что вызов show (3)
требует копирования временного объекта Thing. В этом случае C ++ требует, чтобы у вас был доступный конструктор копирования, даже если ваш компилятор достаточно умен, чтобы его не использовать.
Но почему show (3)
вообще требует копии? Этого я не могу понять. Если повезет, Litb скоро придет.