我的一位同事最近在 VS2008 中生成了类似于以下代码:
class SomeClass {
...
};
void foo(SomeClass const *f) {
...
}
SomeClass bar() {
...
}
foo(&bar());
我的解释是这是不正确的代码,因为 bar
返回的临时地址被传递到 foo
。然而,如果 bar
真的返回一个右值,这应该会产生一个编译时错误。有人可以指出 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
禁用语言扩展会产生错误,而使用扩展则不会。
关于临时地址的 C++ 地址不会导致构建错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44729452/