Вот очень простой C++ 11 программа, которая проверяет вне использования final
ключевого слова, чтобы предотвратить класс от того подклассов:Почему этот код разрешен для компиляции в 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;
}
Если я пытаюсь скомпилировать выше программы под Mac OS X (Clang), я получаю ожидаемые сообщения об ошибках:
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
Однако, если я компилирую тот же код под Windows, с помощью Visual Studio 2013, он компилируется без ошибок. Однако, если класс Base
не templated, Visual Studio распознает ключевое слово final
и испускает ошибку.
Является ли это ошибкой в Visual Studio 2013, или мне не хватает некоторого нюанса о том, как ключевое слово final
разрешено/ожидается для работы в сочетании с шаблонами?
'class Производный: общедоступный Base' делает очень очевидным, что 'Derived' действительно получен; нет места для интерпретации (к счастью). –
molbdnilo
_ "оба компилятора являются« правильными »... различной интерпретацией компиляторов» _ [Это четко определенное поведение] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014 /n4296.pdf) и [Visual Studio ошибочно] (http://stackoverflow.com/a/29710305/1350209). –
Да, правильно ... при создании шаблона класса Base, он получает «окончательный». Мой недостающий пробел ... –
relascope