Errores, fallos, preguntas - página 2199

 
Комбинатор:

Los objetos temporales no suelen borrarse inmediatamente, sino al final del contexto. En C++, si no me equivoco, esto está recogido en el estándar.

Si quieres un borrado rápido, controla el contexto.

Realmente tendrá que hacer operador =

Gracias. SD ha dicho que tiene previsto arreglar el comportamiento actual, pero no se ha fijado ningún plazo.

 

Líneas de color (niveles) al previsualizar (no se imprimió, pero probablemente también en la impresión) gráficos para imprimir en blanco y negro.


 

Terminal Bild 1795

Windows 7 64.


Si inicio la optimización y la interrumpo después de 30 minutos, el terminal se cuelga y no hay forma de detenerlo.

Hay 8 agentes de MetaTester64 en el Administrador de Tareas.

Después de eso no puedo iniciar el terminal. Tengo que esperar o reiniciar el ordenador.


¿Es así para todos?

Запуск платформы - Для продвинутых пользователей - MetaTrader 5
Запуск платформы - Для продвинутых пользователей - MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
 
¿Qué pasa con el foro otra vez? El día ha comenzado y la desaceleración irreal ha comenzado. Las páginas se cargan rápidamente, luego durante unos 30 segundos.
 
Vladimir Karputov:
¿Qué pasa con el foro otra vez? El día ha comenzado y la desaceleración irreal ha comenzado. Las páginas se cargan rápido entonces durante unos 30 segundos.
Rkn, probablemente... hay un problema con el empuje en otros servicios... es como si telegram funcionara a través de ellos...
 
Error del compilador
class A
{
public:
  int i;
  
  void f() const
  {
    A* Tmp = true ? &this : &this; // no problem - BUG!
//    A* Tmp = &this; // '=' - cannot convert from const pointer to nonconst pointer
    
    Tmp.i = 4;
  }
};

void OnStart()
{
  const A a;
  
  a.f();
  
  Print(a.i); // 4
}
 
Ilnur Khasanov:
rkn, supongo... Hay problemas con los pushers en otros servicios... es como si telegram funcionara a través de ellos...

Al estar fuera de Rusia, el sitio web sigue colgándose a veces. Pero lo tengo desde hace meses. Estoy acostumbrado.

 
fxsaber:

Gracias. Resulta que el objeto de retorno y "=" al definir un objeto pasan por un constructor adicional.

De hecho, me gustaría ver una tabla clara en algún lugar, qué casos se llaman constructores (y cuáles), y cuáles se llaman operadores. Ahora mismo todo está a nivel de intuición, y falla, claro.

Es mejor que no confíes demasiado en ninguna regla específica, los compiladores pueden optimizar estas cosas con bastante libertad (rvo, nrvo, copy elision, quizás algunas otras optimizaciones recorten el exceso con seguridad). El constructor de copia y el operador "igual" deberían hacer lo mismo (no es necesario ponerles un comportamiento diferente). Hay un buen enfoque, llamado "copy-and-swap idiom", si el inglés lo permite, se describe en detalle aquí https://stackoverflow.com/questioncopy-and-swap idioms/3279543/what-is-the-copy-and-swap-idiom.
En resumen, se escribe una función de intercambio que se utiliza en todos los constructores y operadores (reducimos la cantidad de código, y obtenemos el mismo comportamiento, lo que resulta en no preocuparse por lo que el compilador llamará, cortar, sobre-optimizar).

dumb_array& operator=(dumb_array other)
{
    swap(*this, other);
    return *this;
}
dumb_array (dumb_array &&other)
{//this должен быть в валидном состоянии
    swap(*this, other);
}
dumb_array& operator=(dumb_array &&other)
{
    swap(*this, other);
    return *this;
}

"Las cadenas resaltadas plantean preguntas. ¿Por qué los objetos temporales no se bloquean en cuanto se utilizan? Es decir, antes de la salida de treinta".

Preguntas correctas, creo. Los objetos temporales deberían haber colapsado después de los dos puntos.

ZS: He retocado un poco el código ahí, ya que el constructor de copia (no el de movimiento) es necesario de todas formas. En el caso de µl, el beneficio no es tan obvio debido a la falta de referencias de rvalue.
What is the copy-and-swap idiom?
What is the copy-and-swap idiom?
  • stackoverflow.com
What is this idiom and when should it be used? Which problems does it solve? Does the idiom change when C++11 is used? Although it's been mentioned in many places, we didn't have any singular "what is it" question and answer, so here it is. Here is a partial list of places where it was previously mentioned:
 
pavlick_:

Es mejor no confiar demasiado en ninguna regla específica, los compiladores pueden optimizar estas cosas con bastante libertad (rvo, nrvo, copy elision, tal vez algunas otras optimizaciones que eliminan con seguridad las cosas innecesarias). El constructor de copia y el operador "igual" deberían hacer lo mismo (no es necesario ponerles un comportamiento diferente). Hay un buen enfoque, llamado "copy-and-swap idiom", si el inglés lo permite, se describe en detalle aquí https://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom.
En resumen, se escribe una función de intercambio que se utiliza en todos los constructores y operadores (reducimos la cantidad de código y obtenemos el mismo comportamiento y como resultado no nos preocupamos por lo que el compilador llama, corta, sobre-optimiza).

"Las líneas resaltadas plantean preguntas. ¿Por qué los objetos temporales no se bloquean en cuanto se utilizan? Es decir, antes de la salida de los treinta".

Preguntas correctas, creo. Los objetos temporales deberían haber colapsado después de los dos puntos.

Gracias, la SD ya ha advertido de los planes de RVO.

 
¿Por qué el script no produce nada?
class A
{
public:
  A() {}
  
  template <typename T>
  void operator =( T& )
  {
    Print(__FUNCSIG__);
  }

  template <typename T>
  A( T& )
  {
    Print(__FUNCSIG__);
  }
};

A* f()
{
  return(new A);
}

void OnStart()
{
  A* a = f();
  
  A* b;
  b = f();
  
  delete a;
  delete b;
}