Ecco un programma C++ 11 molto semplice che mette alla prova l'uso della parola chiave final
per evitare una classe di essere sottoclasse:Perché questo codice è consentito compilare in Visual Studio 2013?
template<class T> class Base final
{
public:
Base() {}
private:
T t;
};
class Derived : public Base<int> {};
int main(int, char **)
{
Derived d;
return 0;
}
Se provo a compilare il programma di cui sopra in Mac OS X (Clang), ottengo i messaggi di errore attesi:
jeremy-friesners-mac-pro-3:~ jaf$ g++ -std=c++11 ./temp.cpp
./temp.cpp:10:28: error: base 'Base' is marked 'final'
class Derived : public Base<int> {};
^
./temp.cpp:1:29: note: 'Base' declared here
template<class T> class Base final
Tuttavia, se compilo lo stesso codice in ambiente Windows utilizzando Visual Studio 2013, si compila senza errori. Se eseguo la classe Base
senza modelli, tuttavia, Visual Studio riconosce la parola chiave final
ed emette un errore.
Si tratta di un bug in Visual Studio 2013 o mi mancano alcune sfumature su come la parola chiave final
è consentita per funzionare in combinazione con le classi basate su modelli?
'classe Derivato: base pubblica' rende molto evidente che 'Derivato' è effettivamente derivato; non c'è spazio per l'interpretazione (fortunatamente). –
molbdnilo
_ "entrambi i compilatori sono 'corretti' ... diversa interpretazione dei compilatori" _ [Questo è un comportamento ben definito] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014 /n4296.pdf) e [Visual Studio è sbagliato] (http://stackoverflow.com/a/29710305/1350209). –
sì giusto ... quando istanziando il modello classe Base, ottiene il "finale". Il mio vuoto mancante ... –
relascope