dimanche 11 mai 2014

c ++ - exigence du compilateur override et final - Stack Overflow


I can remember that during the discussion about general attributes which finally lead to the new contextual keywords override and final it was suggested that compiler support for these ore some may be optional (I guess it would read in the standard text as "behavior is implementation-specific). But I can not find any trace about this optionality in the FDIS and the corrections afterwards.


But since not finding it is not proof, I have to ask: Is the support as described in 2.11p2, 9.2 and 10.3 of the FDIS for override and final obligatory for a conforming compiler?


Is it for example required that a conforming compiler rejects


class Foo {
void func() override; // Error: not virtual, 9.2p9
};

Or is it still conforming by ignoring override?




Yes, it's required that override is not ignored by a conforming implementation. First, override can only appear in the declaration of a virtual member function.


9.2/9:



[...] A virt-specifier-seq shall appear only in the declaration of a virtual member function.



Second, a virtual function which doesn't override a member function of a base class but is marked override makes the program ill-formed.


10.3/7:



If a virtual function is marked with the virt-specifier override and does not override a member function of a base class, the program is ill-formed.



As both are diagnosable rules of the standard it is illegal for a conforming compiler to ignore violations. (1.4/1)


The same reasoning applies to final and the relevant requirements are in 9 [class]/3 and 10.3 [class.virtual]/4.




The use of override and final is optional for the programmer, but nowhere does it say that the compiler can ignore them.


This might have been different for the earlier proposals which used attributes instead of keywords. Attributes leave a lot more freedom to the compiler.



I can remember that during the discussion about general attributes which finally lead to the new contextual keywords override and final it was suggested that compiler support for these ore some may be optional (I guess it would read in the standard text as "behavior is implementation-specific). But I can not find any trace about this optionality in the FDIS and the corrections afterwards.


But since not finding it is not proof, I have to ask: Is the support as described in 2.11p2, 9.2 and 10.3 of the FDIS for override and final obligatory for a conforming compiler?


Is it for example required that a conforming compiler rejects


class Foo {
void func() override; // Error: not virtual, 9.2p9
};

Or is it still conforming by ignoring override?



Yes, it's required that override is not ignored by a conforming implementation. First, override can only appear in the declaration of a virtual member function.


9.2/9:



[...] A virt-specifier-seq shall appear only in the declaration of a virtual member function.



Second, a virtual function which doesn't override a member function of a base class but is marked override makes the program ill-formed.


10.3/7:



If a virtual function is marked with the virt-specifier override and does not override a member function of a base class, the program is ill-formed.



As both are diagnosable rules of the standard it is illegal for a conforming compiler to ignore violations. (1.4/1)


The same reasoning applies to final and the relevant requirements are in 9 [class]/3 and 10.3 [class.virtual]/4.



The use of override and final is optional for the programmer, but nowhere does it say that the compiler can ignore them.


This might have been different for the earlier proposals which used attributes instead of keywords. Attributes leave a lot more freedom to the compiler.


0 commentaires:

Enregistrer un commentaire