非標準動作

ここからのセクションでは、C++ の Microsoft 実装が C++ 規格に準拠しない部分をいくつか示します。 以下のセクション番号は、C++11 標準 (ISO/IEC 14882:2011(E)) のセクション番号を参照しています。

C++ 規格で定義されているものとは異なるコンパイラの制限の一覧については、「コンパイラの制限」を参照してください。

共変の戻り値の型

仮想関数が可変個の引数を持つ場合、仮想既定クラスは共変の戻り値の型としてサポートされません。 これは、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++ コンパイラでは現在、テンプレート初期解析時の非依存名のバインドはサポートされていません。 これは、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++ コンパイラは型 wchar_t ではなく、型 char にこの制約を適用します。 これは、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++ 規格の 1.8 節 6 項によると、完全な C++ オブジェクトには一意の格納場所が必要です。 ただし、Microsoft C++ では、データ メンバーのない型がオブジェクトの有効期間に他の型とデータの格納場所を共有する場合があります。