§5.3.1 Unary operators, Section 3

> 
> The result of the unary & operator is a pointer to its operand. **The operand shall be an lvalue** or a qualified-id.
> 
> 
> 

What exactly does "shall be" mean in this context? Does it mean it's an error to take the address of a temporary? I was just wondering, because g++ only gives me a warning, whereas comeau refuses to compile the following program:

```
#include <string>

int main()
{
    &std::string("test");
}

```

g++ **warning**: `taking address of temporary`

comeau **error**: `expression must be an lvalue or a function designator`

Does anyone have a Microsoft compiler or other compilers and can test this program, please?