我回答了对我的回答的评论:C求职面试 - 演员和比较,发现我找不到C++认为"实施定义行为"的完整列表.我知道这类事情有3个类别:未定义的行为,实现定义的行为和未指定的行为; 然而,似乎大多数讨论都围绕未定义的行为,并且当讨论实现定义的行为时,最多给出一个例子.一般来说,我倾向于编写很多代码来捕获这个区域,我知道会发生什么样的行为; 我仍然希望能够对其有效性发表评论.我还想抛弃那里,我认为操作社区中有很多误诊是未定义的,而实际上它们是由平台很好地定义的.
请注意,我对给定平台如何选择定义此类行为并不感兴趣,而是对包含C++标准定义的"实现定义"类别中的所有行为的列表感兴趣.
我到处寻找对此的解释,但我很快就会出现.我从VS2013 v120平台工具集中看到了这种行为,但是当我将工具集设置为v90(VS2008工具集)时,一切都未初始化.我相信这是由于C++ 11的一些变化,但它也可能是v120平台工具集的异常.
任何人都可以在C++/C++ 11级别上解释这里发生了什么吗?那就是为什么b归零?为什么j不归零呢?(也就是为什么结构体的行为与类不同)
另外,我知道我输出数据的方式是未定义的行为,请忽略它.这里发布的方式比调试器窗口更容易.这是在32位运行,因此指针的大小与unsigned int相同.
请考虑以下代码:
#include <iostream>
class Foo {
public:
int a,
*p;
};
class Bar {
public:
Bar(){}
int a,
*p;
};
struct Jar {
Jar(){}
int a,
*p;
};
int main() {
Foo f;
Bar b;
Jar j;
std::cout << std::hex; // please excuse this undefined-behavior producing test code, it's more simple to show this than a debugger window on SO (this is on 32-bit)
std::cout << "f: " << …Run Code Online (Sandbox Code Playgroud) 在急速的时刻,需要一个指向对象的指针传递给一个函数.我拿了一个未命名的临时对象的地址,令我惊讶的是它编译了(原始代码的警告进一步向下,缺少下面例子中的const正确性).好奇,我设置了一个受控制的环境,一直有警告,并将警告视为Visual Studio 2013中的错误.
请考虑以下代码:
class Contrived {
int something;
};
int main() {
const Contrived &r = Contrived(); // this is well defined even in C++03, the object lives until r goes out of scope
const Contrived *p1 = &r; // compiles fine, given the type of r this should be fine. But is it considering r was initialized with an rvalue?
const Contrived *p2 = &(const Contrived&)Contrived(); // this is handy when calling functions, is it valid? It also …Run Code Online (Sandbox Code Playgroud)