在下面的程序中,结构体
A
同时具有复制构造函数A(const A&)
和从左值引用构造函数A(A&)
。然后一个A
对象被抛出,然后以const A
形式捕获:#include <iostream>
struct A {
A() {}
A(A&) { std::cout << "A(A&) "; }
A(const A&) { std::cout << "A(const A&) "; }
};
int main() {
try {
throw A{};
}
catch ( const A ) {
}
}
所有编译器都接受程序。
据我所知,异常对象从不带有cv限定符,并且处理程序变量是从引用它们的左值初始化的。因此,人们可以期望在catch
中优先选择A(A&)
构造函数。事实上,Clang确实如此做。
但是,GCC更喜欢打印A(const A&)
的复制构造函数。示例: https://gcc.godbolt.org/z/1an5M7rWh
在Visual Studio 2019 16.11.7中发生了更奇怪的事情,程序执行时不会打印任何内容。
哪个编译器是正确的?
const
):https://en.wikipedia.org/wiki/Copy_elision - Jens