You first need to understand the concept of unevaluated context. Rather than me explaining it, I found brilliant details here and here.
In short:
In other words, the unevaluated operands are the operands of some operators of the language. They are expressions in all respects, but such that they are never evaluated. The reason is because those operators are there just to query the compile-time properties of their operands.
For example, sizeof operator only queries size of datatype and is not evaluated.
Back to answer your original question:
In function declaration, you cannot pass a local variable (say n) as default argument e.g.,
void f()
{
int n = 1;
extern void g(int x = n); // error: local variable cannot be a
}
however, unevaluated operands (say sizeof) are allowed, for example:
void f()
{
int n = 1;
extern void h(int x = sizeof n); // OK as of CWG 2082
}
Note that n is local variable but, sizeof is unevaluated operand on variable n (and result is going to be 4 bytes on most modern machines).
Hope this helps (p.s: I don't have reputation to comment so am answering it directly)