const在这里允许(理论上)优化吗?

Max*_*hof 10 c++ const compiler-optimization language-lawyer

请考虑以下代码段:

void foo(const int&);

int bar();

int test1()
{
    int x = bar();
    int y = x;
    foo(x);
    return x - y;
}

int test2()
{
    const int x = bar();
    const int y = x;
    foo(x);
    return x - y;
}
Run Code Online (Sandbox Code Playgroud)

在我的标准的理解,既不x也没有y被允许通过改变footest2,而他们可以通过改变footest1(具有例如const_cast除去constconst int&是因为引用的对象实际上并不是常量中test1)。

现在,gcc,clang或MSVC似乎都没有优化test2foo(bar()); return 0;,并且我可以理解,他们不希望浪费优化来传递很少在实践中应用的优化。

但是我至少对我对这种情况的理解是正确的,还是我错过了一些法律x上的修改方法test2

Flo*_*mer 6

该标准在[dcl.type.cv]中说:

除了可以声明mutable[…]的任何类成员之外,任何在其生存期[…]期间修改[…] const对象[…]的尝试都会导致未定义的行为。

根据[basic.life],也无法通过提前结束对象的生存期来进行定义:

在具有[…]自动存储持续时间的const完整对象所占用的存储中,或在此类const对象在其生命周期结束前曾经占用的存储中创建新对象会导致不确定的行为。

这意味着,优化x - y零是有效的,因为任何试图修改xfoo会导致不确定的行为。

有趣的问题是,是否有理由在现有编译器中不执行此优化。考虑到const对象定义是局部的,test2并且事实是在同一函数中使用的,因此通常的例外(例如,支持符号插入)不适用于此处。