2015-04-17 18 views
18

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?

risposta

18

E ' è davvero un bug.

N4296, [classe]/p3:

Se una classe è contrassegnata con il classe virt-specificatorefinal e appare come un base-tipo-specificatore in una base -clausa (clausola 10), il programma è mal formato.

-5

Non conosco tutti i componenti interni della combinazione, ma IMHO entrambi i compilatori sono "corretti". MSVC vede che la classe template è definitiva e non ne deriva. USI la classe template per definire la classe Base < int>, che non è più definitiva.

IMHO diversa interpretazione dei compilatori.

+1

'classe Derivato: base pubblica ' rende molto evidente che 'Derivato' è effettivamente derivato; non c'è spazio per l'interpretazione (fortunatamente). – molbdnilo

+2

_ "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). –

+0

sì giusto ... quando istanziando il modello classe Base , ottiene il "finale". Il mio vuoto mancante ... – relascope

13

Credo che sia un bug in VS 2013.

Per quello che vale, il compilatore del VS 2015 CTP fa quello che (credo) si sarebbe probabilmente aspetta:

test.cpp(10): error C3246: 'Derived': cannot inherit from 'Base<int>' as it has been declared as 'final' 
Problemi correlati