Compilar este código con g ++ 4.7.0 (-Wall -Wextra -Werror -Wconversion -std=c++11
):inicialización uniforme con {} informes de variable no utilizada
#include <iostream> // std::cout, std::endl
#include <string> // std::string
#include <utility> // std::move
void out(std::string const &message)
{
static int count{0};
std::cout << count++ << " = " << message << std::endl;
}
struct Foo
{
Foo() {out("constructor");}
~Foo() {out("destructor");}
Foo(Foo const &) {out("copy constructor");}
Foo & operator=(Foo const &) {out("copy via assignment"); return *this;}
Foo(Foo &&) {out("move constructor");}
Foo & operator=(Foo &&) {out("move via assignment"); return *this;}
};
int main()
{
auto bar{std::move(Foo())};
out("exiting main");
}
... resultados en el error siguiente:
error: unused variable 'bar' [-Werror=unused-variable]
I pueden quitar el error cambiando la inicialización bar
a cualquiera de los siguientes:
/* 0 */ auto bar(std::move(Foo()));
/* 1 */ Foo bar{std::move(Foo())};
/* 2 */ Foo bar(std::move(Foo()));
/* 3 */ auto bar = std::move(Foo());
/* 4 */ Foo bar = std::move(Foo());
/* 5 */ auto bar __attribute__((unused)) {std::move(Foo())};
Una vez que la inicialización bar
se ha cambiado, la salida es siempre :
0 = constructor
1 = move constructor
2 = destructor
3 = exiting main
4 = destructor
¿Por qué la bar
informe original de inicialización de una variable no utilizada?
¿Qué sucede en el tiempo de ejecución si utiliza la versión "incorrecta" del código y compila sin '-Werror'? –
@JohnZwinck el ** error ** se convierte en ** advertencia ** –
Parece que es solo un caso no controlado en la lógica de advertencia de variable no utilizada. Archivo un error con gcc. – bames53