Share via


/Zc:rvalueCast (Aplicar regras de conversão de tipo)

Quando a opção /Zc:rvalueCast é especificada, o compilador identifica corretamente um tipo de referência rvalue como resultado de uma operação de conversão. Seu comportamento está em conformidade com o padrão C++11. Quando a opção não está especificada, o comportamento do compilador é o mesmo do Visual Studio 2012.

Sintaxe

/Zc:rvalueCast
/Zc:rvalueCast-

Comentários

Se /Zc:rvalueCast for especificado, o compilador seguirá a seção 5.4 do padrão C++11 e tratará apenas expressões de conversão que resultem em tipos de não referência e expressões de conversão que resultem em referências rvalue a tipos de não função como tipos rvalue. Por padrão, ou se /Zc:rvalueCast- estiver especificado, o compilador não estará em conformidade e tratará todas as expressões de conversão que resultem em referências rvalue como rvalues. Por questão de conformidade e para eliminar erros no uso de conversões, recomendamos que você use /Zc:rvalueCast.

Por padrão, /Zc:rvalueCast permanece desativado (/Zc:rvalueCast-). A opção do compilador /permissive- define implicitamente essa opção, mas ela pode ser substituída usando /Zc:rvalueCast-.

Use /Zc:rvalueCast caso você passe uma expressão de conversão como argumento para uma função que utiliza um rvalue como tipo de referência. O comportamento padrão causa o erro de compilador C2664 quando o compilador determina incorretamente o tipo de expressão de conversão. O exemplo mostra um erro de compilador no código correto quando /Zc:rvalueCast não está especificado:

// 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));
   }
};

Talvez o comportamento do compilador padrão não relate o erro C2102 quando apropriado. Neste exemplo, o compilador não relatará um erro se o endereço de um rvalue criado por uma conversão de identidade for utilizado quando /Zc:rvalueCast não está especificado:

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 obter mais informações sobre problemas de conformidade no Visual C++, confira Comportamento fora do padrão.

Para definir esta opção do compilador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para obter detalhes, confira Definir as propriedades de build e do compilador do C++ no Visual Studio.

  2. Selecione a página de propriedades Propriedades da Configuração>C/C++>Linguagem.

  3. Defina a propriedade Impor regras de conversão de tipo como /Zc:rvalueCast ou /Zc:rvalueCast-. Escolha OK ou Aplicar para salvar as alterações.

Confira também

/Zc (conformidade)