I made my own custom OpenGL shader loader for C++. Please tell me is I'm doing anything incorrectly or anything to improve on. I've tested this and it works perfectly fine.

main.cc
`````
std::vector<ShaderInfo> shader_info {
    {GL_VERTEX_SHADER, "shader.vert"},
    {GL_FRAGMENT_SHADER, "shader.frag"}
};
GLuint shader_program {LoadShaders(shader_info)};
glUseProgram(shader_program);
`````

shader-loader.hh
`````
struct ShaderInfo {
	GLenum type;
	std::string file;
};

GLuint LoadShaders(const std::vector<ShaderInfo>&);
`````

shader-loader.cc
`````
GLuint LoadShaders(const std::vector<ShaderInfo>& shader_info) {
	GLuint program {glCreateProgram()};
	std::vector<GLuint> detach;

	for (auto info : shader_info) {
		std::ifstream file {info.file, std::ios_base::in};
		file.seekg(0, std::ios_base::end);
		std::string source(file.tellg(), '\0');

		file.seekg(0, std::ios_base::beg);
		file.read(&source[0], source.size());
		file.close();

		GLuint shader {glCreateShader(info.type)};
		GLchar* source_ptr {&source[0]};
		glShaderSource(shader, 1, &source_ptr, nullptr);

		glCompileShader(shader);
		glAttachShader(program, shader);
		glDeleteShader(shader);
		detach.push_back(shader);

		GLint status;
		glGetShaderiv(shader, GL_COMPILE_STATUS, &status);

		if (status == GL_FALSE) {
			GLint length;
			glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);

			std::string log(length, '\0');
			glGetShaderInfoLog(shader, length, nullptr, &log[0]);

			glDeleteProgram(program);
			throw std::runtime_error(log);
		}
	}

	glLinkProgram(program);
	for (auto shader : detach)
		glDetachShader(program, shader);

	GLint status;
	glGetProgramiv(program, GL_LINK_STATUS, &status);

	if (status == GL_FALSE) {
		GLint length;
		glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);

		std::string log(length, '\0');
		glGetProgramInfoLog(program, length, nullptr, &log[0]);

		glDeleteProgram(program);
		throw std::runtime_error(log);
	}

	return program;
}
`````