小编Gan*_*nil的帖子

c99中的静态struct初始化

GCCc99/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.

他们为什么要这样对我?

c gcc struct compound-literals

16
推荐指数
2
解决办法
3912
查看次数

如何轻松覆盖多个重载方法?

假设我有一个接口和一个实现它的类,如下所示:

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++ templates decorator

7
推荐指数
1
解决办法
137
查看次数

c ++ 11:使用显式的initializer_list对象初始化map

在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)

知道为什么会这样吗?是否有不同的语法或根本不可能?

谢谢.

initializer-list c++11

5
推荐指数
1
解决办法
6001
查看次数