gpt4 book ai didi

c++ - 谁来管理参数中复制构造函数抛出的异常?

转载 作者:行者123 更新时间:2023-12-04 10:08:50 32 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Constructor with by-value parameter & noexcept

(1 个回答)


2年前关闭。




假设我有这个功能

void foo() noexcept
{
// Safely noexcept code.
}

然后这个类:
class Bar
{
Bar(const Bar&) { ... } // Is not noexcept, so might throw
// Non movable:
Bar(Bar&&) = delete;
};

现在,我需要修改 foo() 以按值接收 Bar:
void foo(Bar bar) // noexcept?
{
// Safely noexcept code
}

我假设 Bar 的拷贝是在调用 foo 之前完成的,所以 foo 的代码理论上仍然可以是 noexcept,
但我不确定在 C++ 级别是如何定义的。
foo 是否需要删除 noexcept 或者是在处理 Bar 时可能抛出的调用者?
它是否取决于调用模式(stdcall、farcall 等)或编译器?
更新:在其他问题中,我没有找到任何对调用约定的引用。这应该对行为产生影响。我想。

最佳答案

见[expr.call]/4:

The initialization and destruction of each parameter occurs within the context of the calling function. [ Example: The access of the constructor, conversion functions or destructor is checked at the point of call in the calling function. If a constructor or destructor for a function parameter throws an exception, the search for a handler starts in the scope of the calling function; in particular, if the function called has a function-try-block (Clause 18) with a handler that could handle the exception, this handler is not considered. —end example ]



因此您仍然可以标记 foo noexcept , 即使初始化 bar可能会扔。调用函数不应该是 noexcept . (也就是说,除非您对程序在异常情况下被终止感到满意。)

关于c++ - 谁来管理参数中复制构造函数抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58031634/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com