临时地址的 C++ 地址不会导致构建错误

C++ Address of Temporary Doesn't Cause a Build Error

我的一位同事最近在 VS2008 中生成了类似于以下的代码:

class SomeClass {
    ...
};

void foo(SomeClass const *f) {
    ...
}

SomeClass bar() {
    ...
}

foo(&bar());

我的解释是这是不正确的代码,因为 bar 返回的临时地址被传递到 foo。但是,如果 bar 真的 returns 是一个右值,这应该会产生编译时错误。有人可以指出 C++ 标准的相关部分,这些部分指定此代码是导致定义明确的行为还是未定义的行为?

以下内容不是编译所必需的,如果它作为非标准扩展的一部分,则应该发出诊断信息;打开所有警告以在 msvc 上查看:

class SomeClass {};
void foo(SomeClass const *f) {}
SomeClass bar() { return SomeClass{}; }

int main()
{
    foo(&bar());
}

但是,如果根据标准由于生命周期延长而使用引用,则同样可以编译:

class SomeClass {};
void foo(SomeClass const &f) {}
SomeClass bar() { return SomeClass{}; }

int main()
{
    foo(bar());
}

我用 msvc 2017 测试了这些,但我可以确认使用 /Za 禁用语言扩展会产生错误,而使用扩展则不会。