/Zc:rvalueCast (Menerapkan aturan konversi jenis)
/Zc:rvalueCast
Ketika opsi ditentukan, pengkompilasi dengan benar mengidentifikasi jenis referensi rvalue sebagai hasil dari operasi transmisi. Perilakunya sesuai dengan standar C++11. Saat opsi tidak ditentukan, perilaku pengkompilasi sama seperti di Visual Studio 2012.
Sintaks
/Zc:rvalueCast
/Zc:rvalueCast-
Keterangan
Jika /Zc:rvalueCast
ditentukan, pengkompilasi mengikuti bagian 5.4 dari standar C++11 dan hanya memperlakukan ekspresi cast yang menghasilkan jenis non-referensi dan ekspresi cast yang mengakibatkan referensi rvalue ke jenis non-fungsi sebagai jenis rvalue. Secara default, atau jika /Zc:rvalueCast-
ditentukan, pengkompilasi tidak sesuai, dan memperlakukan semua ekspresi cast yang menghasilkan referensi rvalue sebagai rvalue. Untuk kesuaian, dan untuk menghilangkan kesalahan dalam penggunaan cast, kami sarankan Anda menggunakan /Zc:rvalueCast
.
Secara default, /Zc:rvalueCast
nonaktif (/Zc:rvalueCast-
). Opsi /permissive- compiler secara implisit mengatur opsi ini, tetapi dapat ditimpa dengan menggunakan /Zc:rvalueCast-
.
Gunakan /Zc:rvalueCast
jika Anda meneruskan ekspresi cast sebagai argumen ke fungsi yang mengambil jenis referensi rvalue. Perilaku default menyebabkan kesalahan pengkompilasi C2664 ketika pengkompilasi salah menentukan jenis ekspresi pemeran. Contoh ini menunjukkan kesalahan pengkompilasi dalam kode yang benar saat /Zc:rvalueCast
tidak ditentukan:
// 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));
}
};
Perilaku kompilator default mungkin tidak melaporkan kesalahan C2102 jika sesuai. Dalam contoh ini, pengkompilasi tidak melaporkan kesalahan jika alamat rvalue yang dibuat oleh pemeran identitas diambil ketika /Zc:rvalueCast
tidak ditentukan:
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
}
Untuk informasi selengkapnya tentang masalah kesuaian di Visual C++, lihat Perilaku Nonstandar.
Untuk mengatur opsi pengkompilasi ini di lingkungan pengembangan Visual Studio
Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.
Pilih halaman properti Properti>Konfigurasi C/C++>Language.
Atur properti Terapkan aturan konversi jenis ke
/Zc:rvalueCast
atau/Zc:rvalueCast-
. Pilih OK atau Terapkan untuk menyimpan perubahan Anda.
Baca juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk