GCC在c99/gnu99模式中使用复合文字进行静态结构初始化时,我遇到了一个奇怪的行为.
显然这很好:
struct Test
{
int a;
};
static struct Test tt = {1}; /* 1 */
Run Code Online (Sandbox Code Playgroud)
但是,这不是:
static struct Test tt = (struct Test) {1}; /* 2 */
Run Code Online (Sandbox Code Playgroud)
这会触发以下错误:
初始化元素不是常量
这也无济于事:
static struct Test tt = (const struct Test) {1}; /* 3 */
Run Code Online (Sandbox Code Playgroud)
我确实理解静态结构的初始化值应该是编译时常量.但我不明白为什么这个最简单的初始化表达式不再被认为是常量?这是由标准定义的吗?
我问的原因是我在gnu90模式下遇到了一些用GCC编写的遗留代码,它使用了这种复合文字结构进行静态结构初始化(2).显然,这是当时的GNU扩展,后来被C99采用.
现在,它导致在与成功编译的代码GNU90不能与没有被编译C99,甚至也不是GNU99.
他们为什么要这样对我?
假设我有一个接口和一个实现它的类,如下所示:
class IPrinter
{
public:
virtual void print(int i, int base = 10) = 0;
virtual void print(char c) = 0;
virtual void print(char *s) = 0;
virtual void print(float f) = 0;
virtual void print(double d) = 0;
virtual ~IPrinter() = default;
private:
...
}
class Printer : public IPrinter
{
public:
void print(int i, int base = 10) override {...}
void print(char c) override {...}
void print(char *s) override {...}
void print(float f) override {...}
void print(double d) …Run Code Online (Sandbox Code Playgroud) 在C++ 11中,我可以使用如下所示的initializer_list初始化地图:
map<string, int> mymap = {{"first", 1}, {"second", 2}};
Run Code Online (Sandbox Code Playgroud)
但不是这样的:
initializer_list<pair<string,int>> il = {{"first", 1}, {"second", 2}};
map<string, int> mymap2{il};
Run Code Online (Sandbox Code Playgroud)
知道为什么会这样吗?是否有不同的语法或根本不可能?
谢谢.