Sdílet prostřednictvím


Nestandardní chování

V následujících oddílech jsou uvedeny některé z míst, kde implementace Visual C++ jazyka C++ nesplňuje standard C++.Čísla oddílů, která jsou uvedena níže, odkazují na čísla oddílů ve standardu C++ (ISO/IEC 14882:2011(E)).

Seznam omezení kompilátoru, která se liší od podmínek stanovených ve standardu C++, je uveden v tématu Omezení kompilátoru.

Kovariantní návratové typy

Virtuální základní třídy nejsou podporovány jako kovariantní návratové typy, pokud virtuální funkce má proměnný počet argumentů.To není v souladu s oddílem 10.3, odstavcem 7 specifikace C++ ISO.Následující ukázka nezkompiluje, hlásí chybu kompilátoru C2688

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

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

Názvy nezávislé vazby v šablonách

Kompilátor Visual C++ aktuálně nepodporuje názvy nezávislé vazby při počáteční analýze šablony.To není v souladu s oddílem 14.6.3 specifikace C++ ISO.To může způsobit přetížení deklarované poté, co má být šablona (ale předtím, než je vytvořena instance šablony) zobrazena.

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

Specifikátory výjimek funkcí

Specifikátory výjimek funkcí, kromě throw(), jsou analyzovány, ale nejsou použity.To není v souladu s oddílem 15.4 specifikace ISO C++.Příklad:

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

Další informace o specifikacích výjimek naleznete v tématu Specifikace výjimek.

char_traits::eof()

Standard C++ uvádí, že char_traits::eof nesmí odpovídat platné hodnotě char_type.Kompilátor Visual C++ vynucuje toto omezení pro typ char, ale ne pro typ wchar_t.To není v souladu s požadavky tabulky 62 v oddíle 12.1.1 specifikace C++ ISO.To zachycuje níže uvedený příklad.

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

Umístění úložiště objektů

Standard C++ (odstavec 6 oddílu 1.8) vyžaduje jedinečná umístění úložiště objektů jazyka C++.V jazyce Visual C++ však existují případy, kde typy bez datových členů budou sdílet umístění úložiště s jinými typy po dobu životnosti objektu.