Boost logo

Boost :

Subject: [boost] [system] Viral C++11 change would break dependent libraries:-(
From: Beman Dawes (bdawes_at_[hidden])
Date: 2012-08-27 13:33:16


Ticket #7278 asks that Boost.System add C++11 noexcept support. A
reasonable request, and I implemented it this morning by adding
BOOST_NOEXCEPT at the appropriate places specified in the standard.

But there is a problem. noexcept is viral, so any classes that
inherit from a class that uses noexcept must be changed to also use no
except.

An example: Boost.Filesystem has this class:

  class codecvt_error_cat : public boost::system::error_category
  {
  public:
    codecvt_error_cat(){}
    const char* name() const
      {return "codecvt";}
    std::string message(int ev) const;
  };

Compiling with GCC 4.7 -std=c++0x results in this error:

..\..\../boost/system/error_code.hpp:187:32: error: overriding
'virtual const char* boost::system::error_category::name() const
noexcept (true)'

To fix it, the filesystem class has to be changed:

  class codecvt_error_cat : public boost::system::error_category
  {
  public:
    codecvt_error_cat(){}
    const char* name() const BOOST_NOEXCEPT
      {return "codecvt";}
    std::string message(int ev) const;
  };

I've held off committing the Boost.System changes to trunk until we've
had a chance to discuss how to approach this potential break to an
unknown number of Boost and user libraries.

Ideas?

--Beman


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk