Se recomienda usar Visual Studio 2017

/Zc:rvalueCast (Exigir reglas de conversión de tipos)

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

Cuando se especifica la opción /Zc:rvalueCast, el compilador identifica correctamente un tipo de referencia de valor R como resultado de una operación de conversión de acuerdo con el estándar C++11. Cuando no se especifica la opción, el comportamiento del compilador es el mismo que en Visual Studio 2012. La opción /Zc:rvalueCast está desactivada de manera predeterminada. Por conformidad y para eliminar los errores en el uso de las conversiones, recomendamos utilizar /Zc:rvalueCast.

/Zc:rvalueCast[-]  

Si se especifica /Zc:rvalueCast, el compilador sigue la sección 5.4 del estándar C++11 y trata únicamente las expresiones de conversión que tienen como resultado tipos sin referencia y las que tienen como resultado referencias de valor R a tipos que no son de función como, por ejemplo, los tipos de valor R. De forma predeterminada o si se especifica /Zc:rvalueCast-, el compilador no es conforme y trata como valores R todas las expresiones de conversión que tienen como resultado referencias de valor R.

Use /Zc:rvalueCast si pasa una expresión de conversión como argumento a una función que toma un tipo de referencia de valor R. El comportamiento predeterminado genera el error del compilador C2664 cuando el compilador determina incorrectamente el tipo de la expresión de conversión. Este ejemplo muestra un error del compilador en código correcto cuando no se especifica /Zc:rvalueCast:

// Test of /Zc:rvalueCast  
// compile by using:  
// cl /c /Zc:rvalueCast- make_thing.cpp  
// cl /c /Zc:rvalueCast make_thing.cpp  
  
#include <utility>  
  
template <typename T>   
struct Thing {  
   // Construct a Thing by using two rvalue reference parameters  
   Thing(T&& t1, T&& t2)  
      : thing1(t1), thing2(t2) {}  
  
   T& thing1;  
   T& thing2;  
};  
  
// Create a Thing, using move semantics if possible  
template <typename T>  
Thing<T> make_thing(T&& t1, T&& t2)  
{  
   return (Thing<T>(std::forward<T>(t1), std::forward<T>(t2)));  
}  
  
struct Test1 {  
   long a;  
   long b;  
  
   Thing<long> test() {   
      // Use identity casts to create rvalues as arguments  
      return make_thing(static_cast<long>(a), static_cast<long>(b));   
   }  
};  
  

Puede que el comportamiento predeterminado del compilador no notifique el error C2102 cuando proceda. En este ejemplo, el compilador no notifica un error si se toma la dirección de un valor R creado por una conversión de identidad cuando no se especifica /Zc:rvalueCast:

int main() {  
   int a = 1;  
   int *p = &a;   // Okay, take address of lvalue   
                  // Identity cast creates rvalue from lvalue;    
   p = &(int)a;   // problem: should cause C2102: '&' requires l-value  
}  

Para obtener más información sobre los problemas de conformidad en Visual C++, vea Comportamiento no estándar.

Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para obtener información detallada, vea Trabajar con configuraciones de proyecto.

  2. Seleccione la carpeta C/C++.

  3. Seleccione la página de propiedades Línea de comandos.

  4. Modifique la propiedad Opciones adicionales para incluir /Zc:rvalueCast y, a continuación, elija Aceptar.

/Zc (Ajuste)

Mostrar: