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

标签 c++ visual-studio-2008 c++03

我的一位同事最近在 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/

相关文章:

c++ - Visual Studio 中的 OpenCL - 我们可以编译一个 exe 来使用所有可能的 CPU OpenCL 可以获得所有 OpenCL 支持平台吗?

wpf - 在 Visual Studio 2008 XAML 设计器中引用嵌套类型

c++ - 具有 POD 和未初始化值数组的 auto_ptr

c++ - Qt Visual Studio 插件影子构建

c++ - 为什么 `using`关键字不能用于静态类成员?

c++ - Visual Studio 预处理器仅在设置了/P 时才有效

c++ - 如何保护 C++03 和 C++11 的移动构造函数?

c++ - 为什么 std::inserter 这么慢?

c++ - Msbuild 和 ClCompile 选项

c++ - 按类属性(例如名称)搜索类对象的 std::vector