Bagikan melalui


Perilaku Nonstandard

Bagian berikut mencantumkan beberapa tempat di mana implementasi Microsoft C++ tidak sesuai dengan standar C++. Nomor bagian yang diberikan di bawah ini mengacu pada nomor bagian dalam standar C++11 (ISO/IEC 14882:2011(E)).

Daftar batas pengkompilasi yang berbeda dari yang ditentukan dalam standar C++ diberikan dalam Batas Kompilator.

Jenis Pengembalian Kovarian

Kelas dasar virtual tidak didukung sebagai jenis pengembalian kovarian ketika fungsi virtual memiliki jumlah variabel argumen. Ini tidak sesuai dengan bagian 10.3, paragraf 7 dari spesifikasi ISO C++11. Sampel berikut tidak dikompilasi; ini menghasilkan kesalahan kompilator C2688:

// CovariantReturn.cpp
class A
{
   virtual A* f(int c, ...);   // remove ...
};

class B : virtual A
{
   B* f(int c, ...);   // C2688 remove ...
};

Mengikat Nama Yang Tidak Ditentukan dalam Templat

Pengkompilasi Microsoft C++ saat ini tidak mendukung pengikatan nama yang tidak ditentukan saat awalnya mengurai templat. Ini tidak sesuai dengan bagian 14.6.3 dari spesifikasi ISO C++11. Ini dapat menyebabkan kelebihan beban yang dideklarasikan setelah templat (tetapi sebelum templat dibuat) terlihat.

#include <iostream>
using namespace std;

namespace N {
   void f(int) { cout << "f(int)" << endl;}
}

template <class T> void g(T) {
    N::f('a');   // calls f(char), should call f(int)
}

namespace N {
    void f(char) { cout << "f(char)" << endl;}
}

int main() {
    g('c');
}
// Output: f(char)

Penentu Pengecualian Fungsi

Penentu pengecualian fungsi selain throw() diurai tetapi tidak digunakan. Ini tidak sesuai dengan bagian 15.4 dari spesifikasi ISO C++11. Misalnya:

void f() throw(int); // parsed but not used
void g() throw();    // parsed and used

Untuk informasi selengkapnya tentang spesifikasi pengecualian, lihat Spesifikasi Pengecualian.

char_traits::eof()

Status standar C++ yang char_traits::eof tidak boleh sesuai dengan nilai yang valid char_type . Pengkompilasi Microsoft C++ memberlakukan batasan ini untuk jenis char, tetapi tidak untuk jenis wchar_t. Ini tidak sesuai dengan persyaratan dalam Tabel 62 di bagian 12.1.1 dari spesifikasi ISO C++11. Contoh di bawah ini menunjukkan perilaku ini.

#include <iostream>

int main()
{
    using namespace std;

    char_traits<char>::int_type int2 = char_traits<char>::eof();
    cout << "The eof marker for char_traits<char> is: " << int2 << endl;

    char_traits<wchar_t>::int_type int3 = char_traits<wchar_t>::eof();
    cout << "The eof marker for char_traits<wchar_t> is: " << int3 << endl;
}

Lokasi Penyimpanan Objek

Standar C++ (bagian 1.8 paragraf 6) memerlukan objek C++ lengkap untuk memiliki lokasi penyimpanan yang unik. Namun dengan Microsoft C++, ada kasus di mana jenis tanpa anggota data akan berbagi lokasi penyimpanan dengan jenis lain selama masa pakai objek.