dev - c++17
¿Por qué este fragmento con inicialización uniforme compila con g++ 4.6 pero no con g++ 4.7? (4)
Tenga en cuenta que deriva utiliza la sintaxis de inicialización uniforme de C ++ 11 para llamar al constructor de la clase 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 compila esto, sin embargo, g ++ 4.7 no:
$ 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
¿Que esta pasando?
Actualización 1: también compila sin advertencias con clang ++ - 3.1
Actualización 2: parece un error de compilación seguro. Aparentemente se ha solucionado en GCC 4.7.3.
Encontré esto:
"El borrador dice que una lista de inicializadores que inicializa una referencia no se realiza mediante enlace directo, sino primero construyendo un elemento temporal fuera del elemento en la lista de inicializadores, y luego vinculando la referencia de destino a esa referencia temporal"
Por lo tanto, podría asfixiarse el hecho de que el temporal creado por la base {} se está haciendo a través de un constructor protegido.
Paolo Carlini, colaborador de GCC / libstdc ++, confirmó que se trata de un error / regresión .
Probablemente se deba a que en la versión 4.7 C11 se agregó el control explícito de anulación.
compilar esto con icpc (compilador de inteligencia probado con la versión 11.1 -> 12.1) da:
-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)
editar: pero una vez más, c ++ 11 aún no está completamente implementado en icpc, ya sea http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler/
lo mismo que con g ++ http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
que claramente indica que todavía es experimental, por lo que es muy probable que haya un error.