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

Обратите внимание, что полученный использует унифицированный синтаксис C ++ 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.

47

Решение

Паоло Карлини, участник GCC / libstdc ++, подтвердил, что это ошибка / регрессия.

4

Другие решения

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

-1

компиляция этого с помощью 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: но опять же, c ++ 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

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

-1

Я нашел это:

«В проекте говорится, что список инициализатора, инициализирующий ссылку, выполняется не путем прямого связывания, а путем создания временного элемента вне списка в списке инициализатора, а затем привязки целевой ссылки к этому временному объекту».

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

-1
По вопросам рекламы [email protected]