/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
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.
Selecione a página de propriedades Propriedades da Configuração>C/C++>Linguagem.
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
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários