visual versiones tutorial studio extensions español code c++ templates visual-studio-2013 final

c++ - versiones - ¿Por qué se permite compilar este código en Visual Studio 2013?



visual studio code extensions (3)

Creo que es un error en VS 2013.

Por lo que vale, el compilador del CTP VS 2015 hace lo que (creo) es probable que esperas:

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

Aquí hay un programa muy simple de C ++ 11 que prueba el uso de la palabra clave final para evitar que una clase sea subclasificada:

template<class T> class Base final { public: Base() {} private: T t; }; class Derived : public Base<int> {}; int main(int, char **) { Derived d; return 0; }

Si trato de compilar el programa anterior bajo Mac OS X ( Clang ), recibo los mensajes de error esperados:

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

Sin embargo, si compilo el mismo código en Windows utilizando Visual Studio 2013, compila sin errores. Sin embargo, si hago que la clase Base no tenga plantillas, Visual Studio reconoce la palabra clave final y emite un error.

¿Es esto un error en Visual Studio 2013, o me faltan algunos matices sobre cómo se permite o se espera que funcione la palabra clave final junto con las clases con plantillas?


No conozco todos los aspectos internos de la combinación, pero en mi humilde opinión, ambos compiladores son "correctos". MSVC ve que la clase de plantilla es definitiva y no deriva de ella. UTILIZA la clase de plantilla para definir la clase Base <int>, que ya no es definitiva.

En mi humilde opinión, la interpretación de los compiladores.


De hecho, es un error.

N4296, [clase] / p3:

Si una clase está marcada con la clase-virt-specifier final y aparece como un especificador de tipo base en una cláusula base (Cláusula 10), el programa está mal formado.