Почему этот фрагмент с использованием единой инициализации компилируется с g++ 4.6, но не g++ 4.7?

Обратите внимание, что в производном используется синтаксис синтаксиса С++ 11 для вызова конструктора базового класса.

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 компилирует это, однако g++ 4.7 не делает:

$ 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

Что происходит?

Обновление 1: оно также компилируется без предупреждений с помощью clang++ - 3.1
Обновление 2: Похоже на ошибку компилятора. По-видимому, это исправлено в GCC 4.7.3.

Ответы

Ответ 2

Вероятно, это связано с тем, что в версии 4.7 было добавлено явное управление переопределением C11.

Ответ 3

компиляция с помощью icpc (компилятор Intel, протестированный с версией 11.1 → 12.1) дает:

-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: но опять же, С++ 11 еще не полностью реализован в icpc либо http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler/

то же, что и с g++ http://gcc.gnu.org/gcc-4.7/cxx0x_status.html

который явно утверждает, что он все еще экспериментальный, поэтому ошибка очень вероятна.

Ответ 4

Я нашел это:

"В проекте говорится, что список инициализаторов, инициализирующий ссылку, выполняется не путем прямой привязки, а сначала создавая временный выход из элемента в списке инициализаторов, а затем привязывая целевую ссылку к этому временному"

Таким образом, это может захлебываться тем фактом, что временное создание базы {} выполняется через защищенный конструктор.