小编Mis*_*ody的帖子

在计算初始化值时是否考虑了变量?

这是我的小程序:

enum Type
{
    b = 1,
    c = 2
};

int main()
{
    Type b = b;
    std::cout << b << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

哪个输出0.我可以得出结论,上述定义包含这些连续步骤吗?

  1. 声明b为变量的类型Type
  2. 使用0默认值定义该变量和初始化
  3. 评估它的新值,包括变量本身(值为0)
  4. 将新值分配给变量.

并且,变量是否始终用0初始化,即使它们是显式初始化的?

我的第二个问题是 - 如果它在指定的例子中使用了它的初始化列表中的变量,为什么我不会得到关于歧义的错误?编译器是否首先尝试b在变量列表中查找,然后才检查声明的枚举?

c++ enums variable-initialization variable-declaration

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

ODR的目的是什么?

我确实理解ODR所说的内容,但我不明白它试图实现的目标.

我看到违反它的两个后果 - 用户将得到语法错误,这是完全正常的.并且可能存在一些致命的错误,并且用户将是唯一一个有罪的人.

作为违反ODR并获得致命错误的例子,我想像这样:

a.cpp

struct A
{
        int a;
        double b;
};
void f(A a)
{
        std::cout << a.a << " " << a.b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中

struct A
{
        int a;
        int b;

};
void f(A a);

int main()
{

        A a = {5, 6};
        f(a);

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果示例与ODR无关,请纠正我.

那么,ODR是否试图禁止用户做这些有害的事情?我不这么认为.

是否试图为编译器编写者设置一些规则,以避免潜在的危害?可能不会,因为大多数编译器都没有检查ODR违规.

还有什么?

c++ language-design one-definition-rule linkage

1
推荐指数
2
解决办法
397
查看次数