Bagikan melalui


/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

  1. Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.

  2. Pilih halaman properti Properti>Konfigurasi C/C++>Language.

  3. Atur properti Terapkan aturan konversi jenis ke /Zc:rvalueCast atau /Zc:rvalueCast-. Pilih OK atau Terapkan untuk menyimpan perubahan Anda.

Baca juga

/Zc (Kesuaian)