Derleyici Uyarısı (düzey 4) C4868
'file(line_number)' derleyicisi, kümeli başlatıcı listesinde soldan sağa değerlendirme sırasını zorunlu kılmayabilir
Kümelenmiş başlatıcı listesinin öğeleri soldan sağa sırada değerlendirilir. Derleyicinin bu sırayı garanti edemediği iki durum vardır: birincisi, bazı öğelerin değere göre geçirilen nesneler olmasıdır; İkincisi ile /clr
derlenirken ve öğelerin bazıları nesne alanları veya dizi öğeleridir. Derleyici soldan sağa değerlendirmeyi garanti edemediğinde C4868 uyarısı gösterir.
Bu uyarı, Visual Studio 2015 Güncelleştirme 2 için yapılan derleyici uyumluluğu çalışmalarının bir sonucu olarak oluşturulabilir. Visual Studio 2015 Güncelleştirme 2'nin öncesinde derlenen kod artık C4868 oluşturabilir.
Bu uyarı varsayılan olarak kapalıdır. Bu uyarıyı etkinleştirmek için kullanın /Wall
.
Bu uyarıyı çözmek için, önce öğelerin değerlendirmesinin sıralamaya bağımlı yan etkiler üretebileceği durumlar gibi başlatıcı listesi öğelerinin soldan sağa değerlendirmesinin gerekli olup olmadığını 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 const
başvuruya göre geçirmenin mümkün olup olmadığını göz önünde bulundurun. Bunun gibi bir değişiklik aşağıdaki kod örneğindeki uyarıyı ortadan kaldırır.
Örnek
Bu örnek C4868 oluşturur ve bunu düzeltmenin bir yolunu gösterir:
// C4868.cpp
// compile with: /c /Wall
#include <cstdio>
class HasCopyConstructor
{
public:
int x;
HasCopyConstructor(int x): x(x) {}
HasCopyConstructor(const HasCopyConstructor& h): x(h.x)
{
printf("Constructing %d\n", h.x);
}
};
class TripWarning4868
{
public:
// note that taking "HasCopyConstructor" parameters by-value will trigger copy-construction.
TripWarning4868(HasCopyConstructor a, HasCopyConstructor b) {}
// This variation will not trigger the warning:
// TripWarning4868(const HasCopyConstructor& a, const HasCopyConstructor& b) {}
};
int main()
{
HasCopyConstructor a{1};
HasCopyConstructor b{2};
// the warning will indicate the below line, the usage of the braced initializer list.
TripWarning4868 warningOnThisLine{a, b};
};