Aracılığıyla paylaş


Derleyici Uyarısı (düzey 4) C4866

'file(line_number)' derleyicisi, operator_name çağrısı için soldan sağa değerlendirme sırasını zorunlu kılmayabilir

Açıklamalar

C++17'den başlayarak ->*, [], >><< işleçlerinin işlenenleri soldan sağa sırayla değerlendirilmelidir. Derleyicinin bu sırayı garanti edemediği iki durum vardır:

  • İşlenen ifadelerden biri değer tarafından geçirilen bir nesneyse veya değer tarafından geçirilen bir nesne içeriyorsa veya

  • /clr kullanılarak derlendiğinde ve işlenenlerden biri bir nesnenin veya dizi öğesinin alanıdır.

Derleyici, soldan sağa değerlendirme garantisi vermediğinde C4866 uyarısını yayar. Bu uyarı yalnızca veya daha sonra belirtilirse /std:c++17 oluşturulur, bu işleçlerin soldan sağa sıra gereksinimi C++17'de kullanıma sunulmuştur.

Bu uyarı varsayılan olarak kapalıdır; Komut satırında n düzeyi uyarı olarak etkinleştirmek için /Wall veya /wN 4866 kullanabilir veya kaynak dosyanızda #pragma uyarı kullanabilirsiniz. Daha fazla bilgi için bkz . Varsayılan olarak kapalı olan derleyici uyarıları.

Bu uyarı, C++17 standardı için derleyici uyumluluğu çalışması sonucunda Visual Studio 2017 sürüm 15.9'da kullanıma sunulmuştur. Visual Studio 2017 sürüm 15.9'dan önceki derleyici sürümlerinde uyarı olmadan derlenen kod artık C4866 oluşturabilir. Belirli bir derleyici sürümünde veya sonraki sürümlerinde sunulan uyarıları devre dışı bırakma hakkında bilgi için bkz . Derleyici sürümüne göre Derleyici Uyarıları.

Bu uyarıyı çözmek için, önce işleç öğelerinin soldan sağa değerlendirmesinin gerekli olup olmadığını (örneğin, öğelerin değerlendirmesinin sıralamaya bağımlı yan etkiler üretmesi gibi) göz önünde bulundurun. Çoğu durumda, öğelerin değerlendirilme sırasının gözlemlenebilir bir etkisi yoktur.

Değerlendirme sırasının soldan sağa olması gerekiyorsa, bunun yerine öğeleri başvuruya const göre geçirip geçiremeyeceğinizi göz önünde bulundurun. Bu değişiklik aşağıdaki kod örneğindeki uyarıyı ortadan kaldırır.

Örnek

Bu örnek C4866 oluşturur ve bunu düzeltmenin bir yolunu gösterir:

// C4866.cpp
// compile with: /w14866 /std:c++17

class HasCopyConstructor
{
public:
    int x;

    HasCopyConstructor(int x) : x(x) {}
    HasCopyConstructor(const HasCopyConstructor& h) : x(h.x) { }
};

int operator->*(HasCopyConstructor a, HasCopyConstructor b) { return a.x + b.x; }

// This version of operator->* does not trigger the warning:
// int operator->*(const HasCopyConstructor& a, const HasCopyConstructor& b) { return a.x + b.x; }

int main()
{
    HasCopyConstructor a{ 1 };
    HasCopyConstructor b{ 2 };

    a->*b;        // C4866 for call to operator->*
};