/Zc:rvalueCast (Vynucení pravidel převodu typů)
Pokud /Zc:rvalueCast je zadán parametr, kompilátor správně identifikuje typ odkazu rvalue jako výsledek operace cast v souladu s C ++ 11 standardní.Pokud není zadán parametr, chování kompilátoru je stejný jako sadu Visual Studio 2012.Ve výchozím nastavení /Zc:rvalueCast je vypnuta.Pro shodu a odstraňovat chyby ve využívání položky CAST, doporučujeme použít /Zc:rvalueCast.
/Zc:rvalueCast[-]
Poznámky
Pokud /Zc:rvalueCast a je určena, kompilátor dodržovat 5.4 část C ++ 11 standardní považuje pouze přetypování výrazy, které jsou výsledkem bez odkazové typy a přetypujte výrazy, které jsou výsledkem rvalue odkazy na jiné funkci typy jako typy rvalue.Ve výchozím nastavení nebo pokud /Zc:rvalueCast- není zadán, je normami kompilátor a zpracovává všechny výrazy přetypování, jejichž výsledkem odkazy rvalue jako rvalues.
Použití /Zc:rvalueCast Pokud předáte výraz cast jako argument funkce, která přebírá typ odkazu rvalue.Výchozí chování způsobí, že chyba kompilátoru C2664 Určuje, kdy nesprávně kompilátor typ přetypování výrazu.Tento příklad ukazuje chybu kompilátoru v správný kód, pokud není zadán /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));
}
};
Výchozí chování kompilátoru nemusí zprávu chyba C2102 v případě potřeby.V tomto příkladu kompilátor nehlásí chybu Pokud nedojde k adresu rvalue Autor identity přetypování při /Zc:rvalueCast není zadán:
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
}
Další informace o problémech shody v jazyce Visual C++ naleznete v tématu Nestandardní chování.
Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio
Otevřete dialogové okno Stránky vlastností svého projektu.Podrobnosti naleznete v tématu Práce s vlastnostmi projektu.
Vyberte C/C++ složky.
Vyberte stránku vlastností Příkazový řádek.
Změnit další možnosti vlastnost, aby zahrnovala /Zc:rvalueCast a poté zvolte možnost OK.