Sdílet prostřednictvím


/Zc:rvalueCast (Vynucení pravidel převodu typů)

Pokud je zadána /Zc:rvalueCast možnost, kompilátor správně identifikuje typ odkazu rvalue jako výsledek operace přetypování. Jeho chování odpovídá standardu C++11. Pokud není tato možnost zadaná, chování kompilátoru je stejné jako v sadě Visual Studio 2012.

Syntaxe

/Zc:rvalueCast
/Zc:rvalueCast-

Poznámky

Je-li /Zc:rvalueCast zadán, kompilátor se řídí částí 5.4 standardu C++11 a zpracovává pouze výrazy přetypování, které vedou k nenákazovým typům a přetypování, které vedou k odkazům rvalue na typy nefunkční hodnoty jako typy rvalue. Ve výchozím nastavení nebo je-li /Zc:rvalueCast- zadán, kompilátor nevyhovuje a považuje všechny výrazy přetypování, které vedou k odkazům rvalue jako hodnot rvalue. Ke shodě a k odstranění chyb při použití přetypování doporučujeme použít /Zc:rvalueCast.

Ve výchozím nastavení /Zc:rvalueCast je vypnutá (/Zc:rvalueCast-). Možnost kompilátoru /permissive- implicitně nastaví tuto možnost, ale lze ji přepsat pomocí /Zc:rvalueCast-.

Použije /Zc:rvalueCast se, pokud předáte výraz přetypování jako argument funkci, která přebírá typ odkazu rvalue. Výchozí chování způsobuje chybu kompilátoru C2664 , když kompilátor nesprávně určuje typ výrazu přetypování. Tento příklad ukazuje chybu kompilátoru ve správném kódu, pokud /Zc:rvalueCast není zadán:

// 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í v případě potřeby hlásit chybu C2102. V tomto příkladu kompilátor neohlásí chybu v případě, že je /Zc:rvalueCast zadaná adresa rvalue vytvořeného přetypováním identity:

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 s shodami 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í projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.

  2. Vyberte stránku vlastností jazyka C/C++>Vlastnosti>konfigurace.

  3. Nastavte vlastnost Vynutit pravidla převodu typů na /Zc:rvalueCast nebo /Zc:rvalueCast-. Změny uložíte kliknutím na OK nebo Použít .

Viz také

/Zc (shoda)