/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
Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.
Vyberte stránku vlastností jazyka C/C++>Vlastnosti>konfigurace.
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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro