几个月来,我有一个使用这个基本结构的项目:
struct screenPoint {
float x = 0, y = 0;
screenPoint(float x_, float y_): x{x_}, y{y_}{}
};
一切都很好,然后升级到Xcode 8,可能会有点不同地编译C ++。经过几个小时的调试,我发现我使用的代码如下所示:
screenPoint offset{0,0}; //undefined behavior?
不再保证成员会为0.通常他们中的一个或两个大约是2E20。我最后解决了这个问题:
screenPoint offset{0.0f,0.0f}; //works, the members are zeroed out
C ++中是否有变化,不再像我期待的那样将整数转换为浮点数?
尝试在Mac上重现这个或在Xcode中的iOS模拟器上,我不能。但是,在4岁的iPad上运行的以下基本测试显示,{0,0}
的情况不会使浮点数在随机情况下等于零:
struct screenPoint {
float x = 0, y = 0;
screenPoint(float x_, float y_): x{x_}, y{y_}{}
};
class foo{
public:
foo(int x){}
private:
screenPoint s{0,0};
};
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
while (1) {
foo f(1); //see comment below
} nib.
}
在行foo f(1)
上放置一个断点表明,成员s
的值并非总是0,而x和y的值为0。
为了方便本例,我将C ++结合到Objective C文件中,但在我的代码中,它是一个单独的C ++静态库。