Considere o seguinte cenário (comum) ao lidar com, por exemplo, OpenGL:
Você tem void glUseProgram(GLuint program);
, assim como uma série de outras funções que exigem GLuint
; mas não há glGetUint
, você está preso a glGetInteger
.
Então, digamos que você tem
class Foo() {
public:
Foo::Foo() {
glGetIntegerv(GL_CURRENT_PROGRAM, &program);
}
private:
GLuint program;
void Bar();
};
Por literalmente mais de 10 anos em nosso projeto, tivemos um trecho de código semelhante e somente agora, sem realmente alterar a configuração, o compilador começou a reclamar sobre esta conversão específica:
error: implicit conversion changes signedness: 'GLint' (aka 'int') to 'GLuint' (aka 'unsigned int') [-Werror,-Wsign-conversion]
A solução é obviamente simples:
class Foo() {
public:
Foo::Foo() {
int _program;
glGetIntegerv(GL_CURRENT_PROGRAM, &_program);
program = static_cast<GLuint>(_program);
}
private:
GLuint program;
void Bar();
};
Mas a questão é: posso fazer a mesma coisa em apenas uma etapa, sem precisar usar um int de escopo local no meio?