Как бороться с noexcept в Visual Studio

Я пытаюсь создать собственное исключение, производное 9X_vs11 от std::exception и переопределяющее what(). Сначала я написал 9X_vs11 это так:

class UserException : public std::exception { private: const std::string message; public: UserException(const std::string &message) : message(message) {} virtual const char* what() const override { return message.c_str(); } }; 

Это отлично работает в VS2012, но 9X_c++ не компилируется в GCC 4.8 с -std=c++11:

error: более 9X_visual-studio-11 свободный спецификатор throw для «virtual 9X_visual-studio-11 const char * UserException :: what() const»

Поэтому 9X_visual-studio-11 я добавляю noexcept:

virtual const char* what() const noexcept override 

Это отлично работает в GCC, но 9X_cxx не компилируется в Visual Studio (поскольку 9X_noexcept VS 2012 не поддерживает noexcept):

ошибка C3646: 'noexcept': неизвестный 9X_vs2012 спецификатор переопределения

Каков рекомендуемый 9X_vs2011 способ справиться с этим? Я хочу, чтобы 9X_visual-studio-2012 один и тот же код компилировался обоими 9X_msvc11 компиляторами, и я использую функции C++ 11, поэтому 9X_cpp я не могу скомпилировать с разными -std.

49
0
9
Общее количество ответов: 9

Ответ #1

Ответ на вопрос: Как бороться с noexcept в Visual Studio

Используйте макрос

#ifndef _MSC_VER #define NOEXCEPT noexcept #else #define NOEXCEPT #endif 

Затем определите функцию 9X_noexcept как

virtual const char* what() const NOEXCEPT override 

Вы также можете изменить это, чтобы разрешить 9X_visual-studio-2012 noexcept в более поздних версиях VS, проверив значение 9X_vs2011 _MSC_VER; для VS2012 значение 1600.

45
3

  • Согласно [этому видео (см. Таблицу на 58:00)] (http://channel9.msdn.com/Events/Build/2013/2 ...

Ответ #2

Ответ на вопрос: Как бороться с noexcept в Visual Studio

«noexcept» поддерживается только с Visual 9X_c++ Studio 2015 (как указано здесь: https://msdn.microsoft.com/en-us/library/wfa0edys.aspx). Я использовал 9X_c++0x следующий код с Visual Studio 2013 (полученный 9X_visual-studio-11 из приведенных выше примеров):

#if !defined(HAS_NOEXCEPT) #if defined(__clang__) #if __has_feature(cxx_noexcept) #define HAS_NOEXCEPT #endif #else #if defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC__ * 10 + __GNUC_MINOR__ >= 46 || \ defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023026 #define HAS_NOEXCEPT #endif #endif #ifdef HAS_NOEXCEPT #define NOEXCEPT noexcept #else #define NOEXCEPT #endif 

16
0

Ответ #3

Ответ на вопрос: Как бороться с noexcept в Visual Studio

Эта проверка работает, чтобы узнать, поддерживается 9X_c++0x ли noexcept:

// Is noexcept supported? #if defined(__clang__) && __has_feature(cxx_noexcept) || \ defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC__ * 10 + __GNUC_MINOR__ >= 46 || \ defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 180021114 # define NOEXCEPT noexcept #else # define NOEXCEPT #endif 

Вышеуказанное работает с Clang, GCC 9X_cpp и MSVC.

12
0

Ответ #4

Ответ на вопрос: Как бороться с noexcept в Visual Studio

используйте BOOST_NOEXCEPT в

Библиотека конфигурации boost 9X_vs2012 была разработана для решения подобных проблем 9X_cpp с совместимостью. Согласно the doc:

Если BOOST_NO_CXX11_NOEXCEPT определен 9X_c++11 (например, компиляторы, совместимые с C++ 03), эти 9X_c++0x макросы определяются как:

 #define BOOST_NOEXCEPT #define BOOST_NOEXCEPT_OR_NOTHROW throw() #define BOOST_NOEXCEPT_IF(Predicate) #define BOOST_NOEXCEPT_EXPR(Expression) false 

Если BOOST_NO_CXX11_NOEXCEPT не определен 9X_visual-studio-2012 (т.е. компиляторы, совместимые с C++ 11), они 9X_vs11 определяются как:

 #define BOOST_NOEXCEPT noexcept #define BOOST_NOEXCEPT_OR_NOTHROW noexcept #define BOOST_NOEXCEPT_IF(Predicate) noexcept((Predicate)) #define BOOST_NOEXCEPT_EXPR(Expression) noexcept((Expression)) 

Многие другие ответы здесь 9X_visual-studio-11 имеют аналогичную реализацию, но эта библиотека 9X_vs2011 чище, лучше протестирована и будет делать 9X_visual-studio-11 правильные вещи при обновлении вашего компилятора. Я 9X_noexcept рекомендую посмотреть на библиотеку конфигурации 9X_visual-studio-2012 boost в целом, чтобы узнать о других функциях, особенно 9X_c++ в это время языковых изменений и различных 9X_vs2011 уровней поддержки среди компиляторов.

10
0

Ответ #5

Ответ на вопрос: Как бороться с noexcept в Visual Studio

noexcept - один из самых простых "недостатков" MSVC, с 9X_visual-studio-11 которым можно справиться: просто используйте 9X_c++0x макрос _NOEXCEPT, который в MSVC2013 определен в 9X_visual-studio-11 yvals.h.

3
2

  • ** facepalm ** Хорошо, @svick, тогда используйте макрос, который я вам только что дал, и объедините его с `noexcept` из C++ 11, и вуаля, вы получите решение, ...

Ответ #6

Ответ на вопрос: Как бороться с noexcept в Visual Studio

Добавьте следующие строки в свой код в Visual 9X_noexcept Studio:

#ifdef _NOEXCEPT #define noexcept _NOEXCEPT #endif 

3
1

  • Это не правильно. Вы определяете макрос с тем же литералом, что и зарезервированное ключевое слово, что запр ...

Ответ #7

Ответ на вопрос: Как бороться с noexcept в Visual Studio

Я недавно использовал следующее:

#ifdef _MSC_VER #define NOEXCEPT _NOEXCEPT #else #define NOEXCEPT noexcept #endif 

а затем 9X_c++ просто используйте NOEXCEPT везде.

3
0

Ответ #8

Ответ на вопрос: Как бороться с noexcept в Visual Studio

Похоже, что старый throw() (устаревший в C++ 11) работает 9X_noexcept в обоих компиляторах. Поэтому я изменил 9X_msvc11 код на:

virtual const char* what() const throw() override 

1
0

Ответ #9

Ответ на вопрос: Как бороться с noexcept в Visual Studio

Другой способ - создать файл заголовка и 9X_vs2011 при необходимости включить его в исходный 9X_cxx код, который должен быть скомпилирован с 9X_visual-studio-2012 помощью gcc, vc или clang.

no_except_work_around.h

#ifndef no_except_work_around_H #define no_except_work_around_H #if (_MSC_VER <= 1800) #include #define noexcept #endif #endif //no_except_work_around_H 

=============================================== ======

P.S> не 9X_vs11 распространяется на случай noexcept (ложь) но 9X_c++0x отлично работает для VC2010,2012,2013, gcc 9X_visual-studio-2012 4.9

1
1

  • Преимущество: вы можете начать использовать noexcept, а по ...