47 votes

Pourquoi est-ce que l'extrait de code à l'aide de l'initialisation uniforme compiler avec g++4.6 mais pas g++4.7?

Notez que les dérivés utilise C++11 initialisation uniforme syntaxe pour appeler le constructeur de classe de base.

class base
{
    protected:
        base()
        {}
};

class derived : public base
{
    public:
        derived()
            : base{} // <-- Note the c++11 curly brace syntax
                     // using uniform initialization. Change the
                     // braces to () and it works.
        {}
};

int main()
{
    derived d1;

    return 0;
}

g++4.6 compile ceci, cependant g++4.7 n'est pas:

$ g++-4.7 -std=c++11 -Wall -Wextra -pedantic curly.cpp -o curly
curly.cpp: In constructor ‘derived::derived()':
curly.cpp:4:13: error: ‘base::base()' is protected
curly.cpp:19:24: error: within this context

Ce qui se passe?

Mise à jour 1: Il compile également sans mise en garde avec clang++-3.1
Mise à jour 2: Ressemble à un bug du compilateur pour vous. (Si uncomfirmed)

4voto

DrTwox Points 2316

Paolo Carlini, GCC/libstdc++ contributeur, a confirmé qu'il s'agit d'un bug/régression.

-1voto

Tyler Durden Points 4349

C'est probablement parce que, dans la version 4.7 C11 explicite remplacer le contrôle a été ajouté.

-1voto

Jens Timmerman Points 1448

la compilation de ce avec la cisp ( intel compilateur testé avec la version 11.1 -> 12.1) donne:

-bash-3.2$ icpc -std=c++0x test.c 
test.c(15): error: expected a declaration
          {}
          ^

test.c(12): error: expected a "("
              : base{} // <-- Note the c++11 curly brace syntax
                    ^

compilation aborted for test.c (code 2)

edit: mais là encore, c++11 n'est pas encore pleinement mis en œuvre dans l'icpc soit http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler/

même avec g++ http://gcc.gnu.org/gcc-4.7/cxx0x_status.html

qui stipule clairement qu'il est encore au stade expérimental, si un bug est très probable.

-1voto

Benny Smith Points 171

J'ai trouvé ceci:

"Le projet dit que une liste d'initialiseur de l'initialisation d'une référence se fait pas par liaison directe, mais en construisant un temporaire de l'élément dans la liste d'initialiseur, puis de liaison de la cible de référence pour que temporaire"

Donc, il pourrait s'étouffer sur le fait que le temporaire créé par la base{} qui est fait par l'intermédiaire d'un protégé constructeur.

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