这是我的小程序:
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.我可以得出结论,上述定义包含这些连续步骤吗?
b为变量的类型Type0默认值定义该变量和初始化并且,变量是否始终用0初始化,即使它们是显式初始化的?
我的第二个问题是 - 如果它在指定的例子中使用了它的初始化列表中的变量,为什么我不会得到关于歧义的错误?编译器是否首先尝试b在变量列表中查找,然后才检查声明的枚举?
我确实理解ODR所说的内容,但我不明白它试图实现的目标.
我看到违反它的两个后果 - 用户将得到语法错误,这是完全正常的.并且可能存在一些致命的错误,并且用户将是唯一一个有罪的人.
作为违反ODR并获得致命错误的例子,我想像这样:
struct A
{
int a;
double b;
};
void f(A a)
{
std::cout << a.a << " " << a.b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
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违规.
还有什么?