/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

  1. Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.

  2. Yapılandırma Özellikleri>C/C++>Dil özellik sayfasını seçin.

  3. 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.

/Zc (Uyumluluk)