clang 3.3 и GCC 4.7 const v constexpr

Я просто попытался скомпилировать довольно большой объем кода, используя clang 3.3 с заголовочными файлами стандартной библиотеки GCC 4.7.3 в Ubuntu 13.04. Все прошло хорошо, кроме одной проблемы. Этот код уже компилируется со стандартным пакетом Ubuntu clang 3.2 на этой машине, поэтому я предполагаю, что это некоторые изменения в компиляторе clang 3.3. Проблема связана с const и constexpr с использованием сложного заголовка. В частности, сложный тип имеет следующий блок кода

#ifdef __GXX_EXPERIMENTAL_CXX0X__
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // DR 387. std::complex over-encapsulated.
      constexpr double
      real() { return __real__ _M_value; }

      constexpr double
      imag() { return __imag__ _M_value; }
#else
      double&
      real() { return __real__ _M_value; }

      const double&
      real() const { return __real__ _M_value; }

      double&
      imag() { return __imag__ _M_value; }

      const double&
      imag() const { return __imag__ _M_value; }
#endif

В моем компиляторе я ввожу первый блок кода, и компилятор видит

constexpr double real() { return __real__ _M_value; }

Это приводит к тому, что clang выдает ошибку о том, что реальная функция-член не является константой со следующими

/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/complex:1212:7: 
note: candidate function not viable: 'this' argument has type 'const complex<double>',
      but method is not marked const

      real() { return __real__ _M_value; }

Я прочитал следующий пост Разница между `constexpr` и` const` и несколько других подобных документов, но мне до сих пор не совсем ясно, является ли это проблемой заголовка GCC или проблемой компилятора clang. Я считаю, что функция-член, помеченная constexpr, должна рассматриваться компилятором как const, и в этом случае clang неверен.


person goneskiing    schedule 21.06.2013    source источник
comment
Какие настройки компилятора вы используете?   -  person Nicol Bolas    schedule 05.08.2013


Ответы (1)


Согласно странице статуса для clang, N3652 Ослабление требований к функциям constexpr реализовано частично. Эта статья внесла большие изменения. Следующий отрывок был удален.

Спецификатор constexpr для нестатической функции-члена, не являющейся конструктором, объявляет эту функцию-член константой (9.3.1).

Это изменение означает, что ваша функция больше не может быть вызвана для const объектов. Также см. Исправление функций-членов constexpr без const, которое является предложение исправить те области библиотеки.

person Jesse Good    schedule 21.06.2013
comment
Спасибо, вы на месте. На странице состояния GCC gcc.gnu.org/projects/cxx1y.html указан N3652 еще не реализовано. Я также обнаружил, что наша сборка clang уже имеет -std = c ++ 1y. После выключения clang больше не вызывает ошибку. - person goneskiing; 22.06.2013