临时地址的 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
禁用语言扩展会产生错误,而使用扩展则不会。
我的一位同事最近在 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
禁用语言扩展会产生错误,而使用扩展则不会。