Sdílet prostřednictvím


/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

  1. Otevřete dialogové okno Stránky vlastností svého projektu.Podrobnosti naleznete v tématu Práce s vlastnostmi projektu.

  2. Vyberte C/C++ složky.

  3. Vyberte stránku vlastností Příkazový řádek.

  4. Změnit další možnosti vlastnost, aby zahrnovala /Zc:rvalueCast a poté zvolte možnost OK.

Viz také

Referenční dokumentace

/Zc (shoda)