Почему это предупреждение от IBM XL компиляторов C/C++?

Вы можете сделать это сегодня на Java с помощью Red5 медиасервера от Flash. Если вы также хотите декодировать и кодировать видео в Java, вы можете использовать проект Xuggler .

8
задан CashCow 22 October 2014 в 14:26
поделиться

4 ответа

Правила для этого приведены в §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
9
ответ дан 5 December 2019 в 12:59
поделиться

Мне кажется, что ответ Джерри верен, но есть еще несколько вопросов.

Интересно то, что существует основная проблема, касающаяся предыдущего параграф этого раздела ( 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)
}

Я не могу найти ошибку в Джерри '

1
ответ дан 5 December 2019 в 12:59
поделиться

Что произойдет, если вы попытаетесь присвоить временному объекту имя?

Thing temp (3 );
show (temp);

0
ответ дан 5 December 2019 в 12:59
поделиться

C ++ позволяет достаточно умным компиляторам избегать копирования временных объектов - единственного нарушения правила as-if , разрешенного стандартом. Я не знаком с компилятором IBM AIX C ++, но похоже, что он считает, что вызов show (3) требует копирования временного объекта Thing. В этом случае C ++ требует, чтобы у вас был доступный конструктор копирования, даже если ваш компилятор достаточно умен, чтобы его не использовать.

Но почему show (3) вообще требует копии? Этого я не могу понять. Если повезет, Litb скоро придет.

3
ответ дан 5 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

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