下面的代码无法在作用域/函数内编译,编译器会产生一个错误,指出类似于“初始化元素不是常量”。这在GCC和MSVC上都会发生。
static const char * const * const list = (const char *const[]){ "abc", "def", "xyz" };
但是,当代码放在任何函数之外,并且使用静态存储期的全局变量初始化list
时,代码可以编译通过,不会产生任何警告或错误。只有当list
是非静态的时,它也可以在作用域/函数内进行初始化。
以下引用来自cppreference docs:
如果复合字面值在文件作用域出现,则复合字面值评估为无名对象,具有静态存储期;如果复合字面值在块作用域中出现,则复合字面值评估为无名对象,具有自动存储期(在这种情况下,对象的生命周期在封闭块的末尾结束)。
这是否意味着可以安全地说,具有静态存储期的局部变量不能使用复合字面值进行初始化?