在此示例代码中:
explicit MyClass(std::wstring text) noexcept;
Run Code Online (Sandbox Code Playgroud)
noexcept这里的使用是否正确?wstring可能会抛出构造,但抛出是在我们在构造函数之前还是在构造函数中时?
编辑:假设这可以推广到任何采用按值参数的函数.
我有一个这样的功能模板:
template <typename T>
constexpr auto myfunc() noexcept
{
return T{};
}
Run Code Online (Sandbox Code Playgroud)
由于复制省略,此功能模板是否保证是noexcept?如果在构造函数中抛出异常,这是在函数内部还是外部发生?
假设我有这个功能
void foo() noexcept
{
// Safely noexcept code.
}
Run Code Online (Sandbox Code Playgroud)
然后这个课:
class Bar
{
Bar(const Bar&) { ... } // Is not noexcept, so might throw
// Non movable:
Bar(Bar&&) = delete;
};
Run Code Online (Sandbox Code Playgroud)
现在,我需要修改foo()以通过值接收Bar:
void foo(Bar bar) // noexcept?
{
// Safely noexcept code
}
Run Code Online (Sandbox Code Playgroud)
我假设Bar的复制是在调用foo之前完成的,因此从理论上讲foo的代码仍然可以是noexcept,但是我不确定在C ++级别上是如何定义的。foo是否需要删除noexcept或在应对Bar时可能抛出的调用方?它取决于调用模式(stdcall,farcall等)还是编译器?更新:在其他问题中,我没有找到任何有关调用约定的引用。那应该改变行为。我吃了