从复制省略方法的标准定义:在C++计算机编程中,复制省略指的是一种编译器优化技术,它消除了不必要的对象复制.让我们考虑以下代码
#include <cstdlib>
#include <iostream>
using namespace std;
int n=0;
struct C
{
C (int) {}
C(const C&) {++n;}
};
int main(int argc, char *argv[])
{
C c1(42);
C c2=42;
return n;
}
Run Code Online (Sandbox Code Playgroud)
这行"return n"将返回0或1,具体取决于副本是否被删除.
也考虑这段代码
#include <iostream>
struct C {
C() {}
C(const C&) { std::cout << "Hello World!\n"; }
};
void f() {
C c;
throw c; // copying the named object c into the exception object.
} // It is unclear whether this copy may be elided. …Run Code Online (Sandbox Code Playgroud) 捕获异常时,标准指导是按值抛出,通过引用捕获.据我了解,这有两个原因:
如果我们有一个我们没有在catch块中定义异常名称的场景,那么这些问题(实际上是1.,因为如果我们没有变量的名称,切片不会成为问题)仍然有效吗?
例如:
catch(my_exception)
{ ... }
Run Code Online (Sandbox Code Playgroud)
要么
catch(my_exception &)
{ ... }
Run Code Online (Sandbox Code Playgroud)
如果在这种情况下由值捕获的异常,是否仍有可能终止程序?我的感觉是技术上仍然可行.
注意:我问这个是因为我必须审查某人的代码,在这种情况下按值放置.如问题中所示,我不完全确定任何一种选择的技术影响,但我认为就整体而言,最好在这种情况下通过引用而不管(在任何情况下都没有通过引用捕获的缺点) .