[C++14: 7.1.5/1]:
Спецификаторconstexpr
должен применяться только к определению шаблона переменной или переменной, декларации функции или шаблона функции или объявления статического элемента данных литерала типа (3.9). Если какое-либо объявление функции, шаблона функции или шаблона переменной имеет спецификаторconstexpr
, то все его объявления должны содержать спецификаторconstexpr
. [..]
Обратите внимание, что во втором предложении не упоминается "статический член данных", как это делает первое предложение, поэтому в этом отрывке нет требования, что все объявления (и здесь я рассматриваю специфическое определение) t21 > static
имеет спецификатор constexpr
.
Я не могу найти какое-либо правило в другом месте для этого.
Почему же GCC отклоняет следующую программу?
#include <chrono>
using namespace std::chrono_literals;
#define DUR 1000ms
struct T
{
static constexpr auto dur_1 = DUR;
};
decltype(T::dur_1) T::dur_1;
// main.cpp:12:23: error: 'constexpr' needed for in-class initialization of static data member 'const std::chrono::duration<long int, std::ratio<1l, 1000l> T::dur_1' of non-integral type [-fpermissive]
// decltype(T::dur_1) T::dur_1;
// ^