非標準行為

下列各節列出 Microsoft 實作 C++ 不符合 C++ 標準的一些位置。 以下提供的區段編號是指 C++11 標準中的區段編號(ISO/IEC 14882:2011(E))。

編譯程式限制中會提供 與 C++ 標準中所定義之限制不同的編譯程式限制清單。

Covariant 傳回類型

當虛擬函式具有可變數目的引數時,不支援虛擬基底類別做為 Covariant 傳回型別。 這不符合 C++11 ISO 規格的第 10.3 節第 7 段。 下列範例不會編譯;它會產生編譯程序錯誤 C2688

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

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

樣板中的繫結非相依名稱

最初剖析範本時,Microsoft C++ 編譯程式目前不支援系結非Ependent 名稱。 這不符合 C++11 ISO 規格的第 14.6.3 節。 可能會在樣板出現後 (但在樣板具現化之前) 造成宣告多載。

#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)

函式例外狀況規範

會剖析但不使用 throw() 以外的函式例外狀況規範。 這不符合 ISO C++11 規格的第 15.4 節。 例如:

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

如需例外狀況規格的詳細資訊,請參閱 例外狀況規格。

char_traits::eof()

C++ 標準指出 ,char_traits::eof 不得對應至有效的 char_type 值。 Microsoft C++ 編譯程式會針對 類型 char強制執行此條件約束,但不適用於 類型 wchar_t。 這不符合 C++11 ISO 規格第 12.1.1 節中表格 62 的需求。 下列範例示範此行為。

#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;
}

物件的儲存位置

C++ 標準 (第 6 段第 1.8 節) 要求完整的 C++ 物件必須具有唯一的儲存位置。 不過,使用 Microsoft C++ 時,在某些情況下,沒有數據成員的類型會與其他類型的物件存留期共用儲存位置。