正如初始化所述,需要进行左值到右值的转换?是int x = x;UB吗?C++标准在3.3.2 声明部分中有一个令人惊讶的例子,其中a int用它自己的不确定值初始化:
Run Code Online (Sandbox Code Playgroud)int x = 12; { int x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
Johannes对此问题的回答表明是未定义的行为,因为它需要左值到右值的转换.
在最新的C++ 14草案标准中N3936,可以在此处找到此示例已更改为:
Run Code Online (Sandbox Code Playgroud)unsigned char x = 12; { unsigned char x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
C++ 14中有关于不确定值和未定义行为的变化,这些变化在示例中引发了这种变化吗?
以下代码可以在g ++和Visual C++下通过编译.为什么合法?它看起来不合理,可能会导致隐藏的错误.
int main() {
int i = i;
}
Run Code Online (Sandbox Code Playgroud) 我和我的一位同事讨论过关于他人的问题
Pt pt;
Run Code Online (Sandbox Code Playgroud)
和
Pt pt = Pt();
Run Code Online (Sandbox Code Playgroud)
是等价的.我怀疑在第二种情况下可以调用复制分配,但事实证明并非如此.
当我们进行我们的小实验时,我决定测试一个奇怪的位,我的同事认为甚至不会编译:
//here the compiler calls a copy constructor and doesn't call the default constructor prior to that
// O_o
Pt pt = pt;
Run Code Online (Sandbox Code Playgroud)
以下是一个工作示例:http://ideone.com/XmJSz7
所以,问题是 - 发生了什么:
Pt pt = pt;
Run Code Online (Sandbox Code Playgroud) 为什么第一个注释行正确编译,而第二个没有?
为什么可以a将自己作为构造函数参数,但b不能?
这两个人做的不一样吗?
class Foo { Foo &operator =(Foo const &); /* Disable assignment */ };
int main()
{
Foo a = a; // OK
Foo b(b); // error C2065: 'b' : undeclared identifier
}
Run Code Online (Sandbox Code Playgroud)
由于它看起来像编译器依赖,似乎问题比我想象的更严重.
所以我想问题的另一部分是,以下代码是否有效?
它在GCC中出错,但Visual C++执行得很好.
int main()
{
int i = 0;
{ int *i(&i); }
return i;
}
Run Code Online (Sandbox Code Playgroud) int a = a ;
Run Code Online (Sandbox Code Playgroud)
根据赋值运算符规则,它应该从右到左读取行.看到'a'未声明的编译器后应该给出编译错误.
但是it is giving garbage value.请澄清一下.