8 votes

Désaccord du compilateur sur la visibilité des alias de type template

L'exemple suivant compile avec gcc mais pas avec clang. Quel compilateur est le bon, et pourquoi ?

#include <utility>

struct Foo {

private:

    template<typename T>
    static int f();

public:

    template<typename U>
    using T = decltype(f<U>());

};

int main () {

    static_assert(std::is_same_v<Foo::T<float>, int>);
}

Clang se plaint que 'f' is a private member of 'Foo' . Je pense que ce n'est pas correct car f est accessible depuis l'intérieur de Foo et devrait donc être visible. Il est intéressant de noter que cela fonctionne si T n'est pas un modèle.

Code en direct aquí .

3voto

cigien Points 11

Il s'agit d'un bug de clang Le problème est que clang ne résout pas le contrôle d'accès correct pour les noms utilisés dans les modèles d'alias de membres.

Ce site question est un exemple de ce bogue, où le contrôle d'accès pour les noms des membres des classes amies est résolu de manière incorrecte.

Dans votre exemple, vous avez un modèle de membre statique f et pour cela, nous avons seulement besoin temp.mem#2

... Les règles de contrôle d'accès s'appliquent aux noms des modèles de membres. ...

Alors f est en effet visible dans la déclaration de T et le code est valide.

Notez que la correction mentionnée dans l'article lié fonctionne ici aussi, puisqu'il s'agit du même bogue :

template<typename U, typename X = decltype(f<U>())>
using T = X;  // ok

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X