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.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk