The buffer currently bound to the `GL_ELEMENT_ARRAY_BUFFER` target in OpenGL is part of the state contained in a Vertex Array Object (VAO from here on). According to the OpenGL 4.4 core profile spec then, it would seem that attempting to change or access the `GL_ELEMENT_ARRAY_BUFFER` while no VAO is bound is an error:

> 
> *10.4 Vertex Array Objects*
> 
> 
> ... An `INVALID_OPERATION` error is generated by any commands which
>  modify, draw from, or query vertex array state when no vertex array
>  is bound. This occurs in the initial GL state, and may occur as a
>  result of **BindVertexArray** or a side effect of **DeleteVertexArrays**.
> 
> 
> 

This is supported by the OpenGL wiki's [Buffer Object](http://www.opengl.org/wiki/Buffer_Object) page:

> 
> `GL_ELEMENT_ARRAY_BUFFER​`
> 
> 
> All rendering functions of the form `gl*Draw*Elements*​` will use the pointer
>  field as a byte offset from the beginning of the buffer object bound to this
>  target. The indices used for indexed rendering will be taken from the buffer
>  object. **Note that this binding target is part of a Vertex Array Objects state,
>  so a VAO *must* be bound before binding a buffer here.**
> 
> 
> 

Now, it would be nice if this were not the case. It would make it easy to create and manage index buffers separately from any particular VAO. But if just binding a buffer to `GL_ELEMENT_ARRAY_BUFFER` is verboten when there's no VAO bound, the only alternative is for the class representing an index buffer to bind a dummy VAO when they are created/updated/etc.

Nicol Bolas' excellent [OpenGL tutorial](http://www.arcsynthesis.org/gltut/Positioning/Tutorial%2005.html) says that this type of use is in fact valid:

> 
> `glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)`: Calling this without a VAO bound will not fail.
> 
> 
> 

This seems to contradict the standard and opengl.org wiki. Is there something in the standard supporting this that I've missed, or is this only referring to compatibility profile contexts where using a VAO is not required?