考慮一個A洗掉了復制建構式的結構,但取而代之的是來自非 const 參考的建構式。可以A像示例程式一樣拋出一個物件,然后按值捕獲它:
struct A {
A() {}
A(A&) {}
A(const A&) = delete;
};
int main() {
try {
throw A{};
}
catch( A ) {
}
}
GCC 和 Clang 都允許這種用法。雖然 MSVC 列印了一個錯誤:
C2316: 'A': cannot be caught as the destructor and/or copy constructor are inaccessible or deleted
演示:https : //gcc.godbolt.org/z/P4c6Ea9fz
IndeedA(const A&)已洗掉,但A(A&)可在此處訪問。這是來自 MSVC 的錯誤診斷嗎?
uj5u.com熱心網友回復:
這是一個 MSVC 錯誤:例外物件從來都不是cv限定的,并且處理程式變數是從參考它們的左值初始化的。(標準實際上并沒有說明該左值的型別是什么,但沒有理由它應該是 const 限定的。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/351708.html
