/Zc:rvalueCast (Tür dönüştürme kurallarını zorlama)
Seçenek belirtildiğinde /Zc:rvalueCast
, derleyici bir atama işleminin sonucu olarak bir rvalue başvuru türünü doğru şekilde tanımlar. Davranışı C++11 standardına uygundur. Seçenek belirtilmemişse, derleyici davranışı Visual Studio 2012'dekiyle aynıdır.
Sözdizimi
/Zc:rvalueCast
/Zc:rvalueCast-
Açıklamalar
Belirtilirse /Zc:rvalueCast
, derleyici C++11 standardının 5.4 bölümünü izler ve yalnızca başvuru dışı türlerle sonuçlanabilen atama ifadelerini ve işlev dışı türlere rvalue türleri olarak rvalue başvuruları ile sonuçlayan atama ifadelerini işler. Varsayılan olarak veya belirtilirse /Zc:rvalueCast-
, derleyici uyumsuzdur ve rvalue başvurularına neden olan tüm atama ifadelerini rvalue olarak değerlendirir. Uyumluluk ve tür atamaları kullanımındaki hataları ortadan kaldırmak için kullanmanızı /Zc:rvalueCast
öneririz.
Varsayılan olarak kapalıdır /Zc:rvalueCast
(/Zc:rvalueCast-
). /permissive- derleyici seçeneği bu seçeneği örtük olarak ayarlar, ancak kullanılarak /Zc:rvalueCast-
geçersiz kılınabilir.
Bir atama ifadesini rvalue başvuru türü alan bir işleve bağımsız değişken olarak geçirirseniz kullanın /Zc:rvalueCast
. Varsayılan davranış, derleyici atama ifadesinin türünü yanlış belirlediğinde derleyici hatası C2664'e neden olur. Bu örnek, belirtilmemiş olduğunda /Zc:rvalueCast
doğru kodda bir derleyici hatası gösterir:
// 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));
}
};
Varsayılan derleyici davranışı uygun olduğunda C2102 hatasını bildirmeyebilir. Bu örnekte, kimlik ataması tarafından oluşturulan rvalue adresi belirtilmemiş olduğunda /Zc:rvalueCast
alınırsa derleyici hata bildirmez:
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
}
Visual C++'daki uyumluluk sorunları hakkında daha fazla bilgi için bkz . Standart Dışı Davranış.
Bu derleyici seçeneğini Visual Studio geliştirme ortamında ayarlamak için
Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.
Yapılandırma Özellikleri>C/C++>Dil özellik sayfasını seçin.
Tür dönüştürme kurallarını zorla özelliğini veya
/Zc:rvalueCast-
olarak/Zc:rvalueCast
ayarlayın. Değişikliklerinizi kaydetmek için Tamam'ı veya Uygula'yı seçin.
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin