У меня есть фреймворк, который определяет исключение как класс, не подлежащий копированию, из которого мы вывели класс для копирования (определяющий конструктор копирования, вызывающий конструктор базового класса без копирования)
Это работает под g++, но не под MSVC 2013.
Следующий код воспроизведет проблему:
#include <iostream>
using namespace std;
#if defined _MSC_VER
#define __PRETTY_FUNCTION__ __FUNCTION__
#endif
class u {
u(const u&) = delete;
const u& operator=(const u&) = delete;/* the library we use defines it as const u& */
public:
u() { cout << __PRETTY_FUNCTION__ << "def" << endl; }
protected:
explicit u(int i) { cout << __PRETTY_FUNCTION__ << "int: " << i << endl; }
};
class e : public u {
public:
e() { cout << __PRETTY_FUNCTION__ << "def" << endl; }
e(const e& _e) : u(1) { cout << __PRETTY_FUNCTION__ << "cpy" << endl; }
e& operator=(const e& _e) { cout << __PRETTY_FUNCTION__ << endl; return *this; }
};
int foo() {
e _e;
throw _e;
return 0;
}
int main() {
try {
foo();
} catch(const e& _e) {
cout << "in catch e" << endl;
} catch(...) {
cout << "in catch..." << endl;
}
#if defined _MSC_VER
cout << "press enter to exit" << endl;
cin.get();
#endif
return 0;
}
MSVC жалуется на Error 1 error C2280: 'u::u(const u &)' : attempting to reference a deleted function
в конце функции foo().
g++ и clang как скомпилировать код, так и вообще не использовать конструктор копирования (объект e перемещен), но не будет компилироваться, если e
не является конструктивным для копирования.
EDIT: я редактировал код для принудительной копии.
BTW, если функции копирования u
не удаляются (и не определены, pre-С++ 11 не копируются), MSVC выходит из строя на этапе ссылки во время поиска u::u(const u&)
. (неразрешенный внешний)
Есть ли недостаток в моем коде, или это ошибка в MSVC?