【发布时间】:2016-04-12 22:10:54
【问题描述】:
在 [except.ctor] 中,标准 (N4140) 保证:
...调用析构函数 自从 try 块被构造的所有自动对象 输入...
但是在下面的例子中,空的output证明了函数foo的返回值没有被破坏,尽管它已经被构造了。使用 g++ (5.2.1) 和 clang++ (3.6.2-1) 和选项 -O0 -fno-elide-constructors -std=c++14 编译。
struct A { ~A() { cout << "~A\n"; } };
struct B { ~B() noexcept(false) { throw 0; } };
A foo() {
B b;
return {};
}
int main() {
try { foo(); }
catch (...) { }
}
这是 g++ 和 clang++ 中的错误,还是函数返回值不是 被认为是自动对象,还是 C++ 语言中的一个漏洞?
在 [stmt.return]、[expr.call] 或 [dcl.fct] 中我都找不到 明确说明函数返回值是否被视为自动 目的。我发现的最接近的提示是 6.3.3 p2:
...return 语句可以 涉及临时对象的构造和复制或移动...
和 5.2.2 p10:
如果结果类型是左值,则函数调用是左值 引用类型或对函数类型的右值引用,如果 结果类型是对对象类型的右值引用,否则是纯右值。
【问题讨论】:
标签: c++ exception-handling return return-value language-lawyer